Ajax请求为啥总是被CORS拦截?
我在本地用 http://localhost:3000 调后端接口 http://api.example.com/data,浏览器一直报 CORS 错误,明明后端说已经加了跨域头啊?
我试过在 fetch 里加 credentials,也试过换 axios,但控制台还是报:
Access to fetch at 'http://api.example.com/data' from origin 'http://localhost:3000' has been blocked by CORS policy
后端返回的响应头看起来是这样的:
{
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
"Access-Control-Allow-Headers": "Content-Type"
}
这到底还缺啥?为什么还是跨域失败?
你后端返回的头看着好像挺全,但有个致命问题:**当请求需要带 credentials(Cookie、Authorization 这些)的时候,Access-Control-Allow-Origin 不能用 *(通配符)**。
你提到在 fetch 里加了 credentials,对吧?浏览器这波操作是正常的——它看到 withCredentials: true,但 Access-Control-Allow-Origin 却是 *,直接就给你驳回了。安全策略不允许这么干。
具体来说,你后端还缺一个关键头:Access-Control-Allow-Credentials: true
解决方案分两种情况:
第一种情况:你的接口确实需要带 Cookie 或 Authorization
后端必须把 * 改成具体的域名,同时加上允许 credentials 的头:
前端 fetch 这么写:
第二种情况:其实不需要带 credentials
那就把前端的 credentials 改成 'same-origin' 或者直接删掉,同时后端可以用 *。但看你的情况,大概率是想要带认证信息的。
还有一点:OPTIONS 预检请求也得处理好,很多后端就是漏了这个导致简单请求之外的都挂掉。
你检查一下后端代码,看看是不是没处理 OPTIONS 方法,或者头信息没返回全。