请求头字段Cache-Control跨域预校验不被允许问题求助
解决Request header field Cache-Control is not allowed by Access-Control-Allow-Headers的CORS错误
嘿,我来帮你搞定这个头疼的CORS问题!
首先得搞清楚为啥Postman能用,但复制代码到测试文件就报错——Postman不受浏览器同源策略限制,它不会发送CORS预检的OPTIONS请求,直接就把请求发出去了;但当你在浏览器环境或者用PHP模拟前端请求时,浏览器会先自动发一个OPTIONS预检请求,检查你的服务器是否允许这次请求里带的头信息,而你的服务器之前的配置没通过这个预检,所以就报错了。
你的问题出在Access-Control-Allow-Headers这个响应头的配置上:你写了Cache-Control,...,但省略号并没有被解析成允许所有头,服务器没明确把Cache-Control加入允许列表,所以预检就失败了。
给你两个可行的解决方案:
方案1:明确列出所有需要允许的请求头
把Access-Control-Allow-Headers里的内容补全,明确包含Cache-Control,同时加上其他可能用到的头(比如Content-Type、Authorization这些),还要记得专门处理OPTIONS预检请求:
<?php // 先处理OPTIONS预检请求,这一步很关键! if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS'); // 明确列出允许的请求头,把Cache-Control加进去 header('Access-Control-Allow-Headers: Cache-Control, Content-Type, Authorization'); // 缓存预检结果1天,减少重复的OPTIONS请求 header('Access-Control-Max-Age: 86400'); exit; // 处理完预检就直接退出,不用执行后面的业务逻辑 } // 处理实际的业务请求 header('Access-Control-Allow-Origin: *'); // 这里写你的API逻辑代码 ?>
方案2:用通配符允许所有请求头(谨慎使用)
如果你不确定会用到哪些请求头,也可以用*来允许所有头,但注意如果你的请求需要带凭证(比如Cookie),这个通配符就不生效,必须明确列出头:
<?php if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS'); header('Access-Control-Allow-Headers: *'); header('Access-Control-Max-Age: 86400'); exit; } header('Access-Control-Allow-Origin: *'); // 业务逻辑代码 ?>
配置完之后,再测试你的请求,应该就能正常通过CORS预检,不会再报那个错误啦!
内容的提问来源于stack exchange,提问作者Raj Shah
相关产品推荐
相关产品推荐

