什么是跨域?
CORS,全称 Cross-Origin Resource Sharing,中文常叫 跨源资源共享。
浏览器检查流程


浏览器发送预检请求之后,判断响应报文的 Origin /Methods /Headers 与前端的请求时候一致
同源(Origin)的判断标准
[协议]://[域名]:[端口]
上面三个元素只要有一个不同就不属于同源。
跨域问题是谁检测的?
浏览器,浏览器用于保护数据的一种方式。浏览器防止将后端的返回数据交给不安全的处理程序(JavaScript)。
如何避免(最佳实践)?
前端和 /api 同域部署:
使用 nginx(代理程序) 将 API 请求转发出去。

必须跨域情况:
严格使用
- Origin:谁来访问我?【前端域名】
- Allow-Origin:我允许谁访问?【白名单域名】
- Allow-Methods:我允许哪些方法?【GET、PUT、POST 等】
- Allow-Headers:我允许哪些请求头?【Content-Type, Authorization】
带登录状态:
- Access-Control-Allow-Credentials: true
- Allow-Origin 不能使用 *
排错方式
- 1. 前端页面 Origin 是什么?(前端的域名)
- 2. API 地址 Origin 是什么?(后端的域名)
- 3. 是否真的跨域? (是否协议、域名、端口一致)
- 4. Network 里有没有 OPTIONS? (预检请求)
- 5. OPTIONS 返回状态码是多少? (200\204 属于正常、其它不正常)
- 6. OPTIONS 响应里有没有 Access-Control-Allow-Origin? (预见响应报文,是否有这个配置)
- 7. Allow-Origin 是否和当前 Origin 完全一致? (这个配置是否和预期一致)
- 8. 真实请求方法是否在 Access-Control-Allow-Methods 里?(正式请求)
- 9. 真实请求 Header 是否在 Access-Control-Allow-Headers 里? (正式请求)
- 10. 是否携带 Cookie / Authorization? (授权请求)
- 11. 如果携带 Credentials,是否返回了 Access-Control-Allow-Credentials: true?
- 12. 如果携带 Credentials,是否错误使用了 Allow-Origin: *?
- 13. 真实请求响应是否也带 CORS Header?
- 14. 是否发生了 301 / 302 重定向? (不能出现重定向)
- 15. 是否被 Nginx / 网关 / CDN 改写了响应头? (保证只有一处进行配置)
- 16. 是否错误地返回了多个 Access-Control-Allow-Origin?
- 17. 错误响应、401、403、500 是否也带 CORS Header?(错误响应也需要包含)
