记 Accept-Language: "zh-CN" 引发的思考
先说结论:
"CORS 安全列表请求标头",不仅仅指 请求头的 key,也约束了 key 对应的值域
现象
- 在开发过程中遇到,当 Accept-Language 被错误改成 "zh-CN" 时,会导致页面请求跨域。
- 而当设置成 zh-CN(没有被双引号包裹)时,请求正常发出,没有跨域。
疑问
- 为什么加上双引号包裹会导致跨域?
- 为什么跨域报的错误是 "accept-language is not allowed by Access-Control-Allow-Headers"。Accept-Language 不是内置请求头吗?非自定义请求头为什么还需要额外设置到 Access-Control-Allow-Headers?
- 当设置成 zh-CN(没有被双引号包裹)时,Accept-Language 也不在 Access-Control-Allow-Headers 里,为什么可以运行?
原因
- "zh-CN" 不符合「CORS 安全列表请求标头」中,Accept-Language 的值域要求
- 所以如果要使得 Accept-Language: "zh-CN" 生效,可通过将 Accept-Language 加入 Access-Control-Allow-Headers。突破「CORS 安全列表请求标头」的值域要求,直接不校验了。所以这个报错提示也正确
- 其实很多文章都有写,如阮一峰的文章,https://www.ruanyifeng.com/blog/2016/04/cors.html。但要么漏了细节(值域要求),要么没经历过,引起不了重视,也就不记得。
- MDN 相关介绍:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Acc...
所以
- Accept-Language 确实非自定义请求头
- Access-Control-Allow-Headers 的内容除自定义请求头外,也可能是「CORS 安全列表请求标头」中的 key(用于突破值域限制)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。