我们的网关默认是不约束前端的跨域请求的,所以在代理上面我们直接设置了跨域的头部为全部允许,但是我们发现在部分情况下,前端请求还是跨域,经过分析这部分跨域的请求都是复杂请求(比如POST请求自定义了http的头部),请求会提前发起一个OPTIONS类型的预检请求,这个请求如果返回状态不正确,浏览器将不会发起真实的数据请求,而显示为CORS error。
由于我们本身就是不控制cors的,所以直接在location下面配置如下逻辑(遇到OPTIONS请求直接返回204):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
server {
# ...
location /path {
# ...
more_set_headers 'Access-Control-Allow-Origin: *';
more_set_headers 'Access-Control-Allow-Headers: *';
more_set_headers 'Access-Control-Allow-Methods: *';
more_set_headers 'Access-Control-Allow-Credentials: true';
if ($request_method = 'OPTIONS') {
# 缓存预检请求,减少预检请求的发起
more_set_headers 'Access-Control-Max-Age: 3600';
# 204 (no content)
return 204;
}
# ...
}
}
|
返回204是因为204是代表没有内容,但是请求正常。