为什么我的前端请求总是报错”Blocked by CORS”,即使后端设置了Access-Control-Allow-Origin?

诸葛付娟 阅读 4

我在做前后端分离项目时遇到个怪问题:fetch('/api/data')请求总是被浏览器拦截,显示”Blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header present”。

但后端明明在响应头里写了Access-Control-Allow-Origin: *。我尝试过用POSTMAN测试接口,直接访问API路径都能正常返回数据。用浏览器开发者工具看,请求头里有Origin: http://localhost:3000,可响应头里就是看不到CORS相关的头信息。

后端是PHP写的,响应头代码如下:


header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');

最奇怪的是GET请求偶尔能成功,但POST请求百分百失败。难道是预检请求的问题?可我明明设置了OPTIONS方法…

我来解答 赞 6 收藏
二维码
手机扫码查看
1 条解答
设计师晨晰
大概率是预检请求没处理好,OPTIONS请求返回的状态码或者头部有问题。你得确保OPTIONS请求返回204状态码,并且响应头里也得带上CORS相关配置。

试试在PHP里加个判断,专门处理OPTIONS请求:
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
header('HTTP/1.1 204 No Content');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');
exit;
}


另外,浏览器缓存可能也会搞事,清一下缓存或者换个隐身模式试试,应该能用。
点赞 1
2026-02-18 17:06