在跟客户对Nginx跨域问题的过程中遇到的几种情况
技术背景是SaaS平台采用vue axios请求,客户后端java
第一次
最开始本地没有启用
axios.defaults.withCredentials = false
这项axios配置的跨域设置,客户后端Nginx配置跨域
"Access-Control-Allow-Origin", "*"
但是神奇的地方来了,set-cookie可以成功赋值,但是有时间间隔(这个间隔多久也不知道),问题出现在第二天我刷新页面,本地存在一个cookie已经过期,但是请求以后的set-cookie没有正确的赋值,后续的认证获取录音进行的播放失败,地址报错403
第二次
本地开启
axios.defaults.withCredentials = true
Nginx配置域名,这里对接同事也没配置过,以产品为主的同事
"Access-Control-Allow-Origin", "www.XXX.com,www.XXX.com"
这样配置了两个跨域地址,然后我查询万能百度后改为
set $cors '';
if ($http_origin ~* "^https://www.XXX.com$"){
set $cors $http_origin;
}
if ($http_origin ~* "^https://www.XXX.com$"){
set $cors $http_origin;
}
···
location /api/v2/ {
add_hearder 'Access-Control-Allow-Origin' '$cors';
add_hearder 'Access-Control-Allow-Credentials' 'true';
add_hearder 'Access-Control-Allow-Methods' '*';
add_hearder 'Access-Control-Allow-Headers' '*';
}
配置完成后提示
Request header field [authorization] is not allowed by [Access-Control-Allow-Headers] in preflight response.
第三次
发现上述报错后奈何英语不好,翻译无果后百度也没有找到有用信息,最后查看具体英文格式单独查后发现Access-Control-Allow-Headers
缺少配置authorization
(这个地方再解决完问题时还没明白为什么会报错)查询出来的结果也有一串代码附上,我以为重点是再"Access-Control-Allow-Methods","GET, POST, DELETE, PUT"
配置完成后还是提示,再次查询发现Access-Control-Allow-Headers
的值大多数文章没有设置为通配符*
,而是配置了大量值,让同事将代码改为
'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'
测试后问题解决
关于Access-Control-Allow-Headers
的值为什么不能为*
解决完问题后查找具体原因发现有位大佬的文章里面分析的很明白,结论是
Access-Control-Allow-Headers: * 在部分客户端上有兼容问题。
注:跨域错误是不会暴露给JS的,就意味着 try{}catch(corsError){corsError.message}拿不到错误的具体信息,不太好在没有控制台的环境看到问题。
同时也看到了别人引入CORS官网的一张图片,希望可以对排查问题带来方便
注:
Nginx中的响应头'Accept-Ranges' bytes
会控制返回多媒体数据可不可以进行拖放进度,如果有多媒体不能进行进度拖放检查一下有没有。