← 知识文章

HTTP FIELD GUIDE

CORS 与浏览器 HTTP 请求

理解为何 cURL 可以成功,而网页里的相同请求却失败。

浏览器为什么阻止请求?

网页遵守同源策略。跨域 fetch 请求需要目标服务通过 CORS 响应头授权。某些方法或请求头会让浏览器先发送 OPTIONS 预检;若预检失败,正式请求可能根本不会发出。

cURL 有什么不同?

cURL 不受浏览器 CORS 规则约束。终端命令成功,只说明该机器可以访问接口,不能证明网页能读取响应。浏览器还控制 Host、Cookie 等请求头;HTTPS 页面请求不安全的 HTTP 地址也可能被阻止。

如何排查?

在浏览器网络面板检查预检请求、目标 Origin 和响应头。核对 Access-Control-Allow-Origin 以及允许的方法和请求头是否匹配。不要把 fetch 的 no-cors 当作绕过方案:它会得到不可读取状态、请求头和正文的不透明响应。接口无法开启 CORS 时,可用可信的本地客户端或有完善防护的转发服务。

参考资料