前端Ajax或Axios等XMLHttpRequest请求一个第三方的接口时,会出现跨域问题。
简单请求与复杂请求的差别是复杂请求会自动发出一个 OPTIONS 的预检请求,当请求得到确认后,才开始真正发送请求。
综上,我们要解决两个问题:
- OPTIONS 请求的正确响应
- 跨域请求正确响应
解决方案
只需在Nginx侧过滤掉OPTIONS请求,不转发给第三方接口,直接在Nginx就返回前端。前端就会认为OPTIONS请求成功了继续发送POST请求,此时Nginx将此次的POST请求真正转发给第三方接口。
location /test {
if ($request_method = OPTIONS) {
add_header Access-Control-Allow-Origin $http_origin; # 必须要有
add_header Access-Control-Allow-Headers *; # 必须要有
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
add_header Access-Control-Allow-Credentials true;
return 200; # 204也可以,只要返回成功码即可
}
proxy_pass http://abc.com/def;
}