同域名下Ajax调用PHP接口出现CORS跨域403错误如何解决
问题根源定位
- 首先纠正认知误区:同源策略要求协议、域名、端口三者完全一致才算同源,你提到的
http://www.mywebsite.com、https://mywebsite.com、https://www.mywebsite.com三者协议、域名配置均不相同,属于跨域场景,并非同域名。 - 403错误和CORS配置无直接关联:CORS配置错误只会触发浏览器侧的跨域拦截报错,响应状态码通常为200,不会返回403。返回403说明你的服务端程序、前置Web服务器(Nginx/Apache)、WAF或CDN直接拒绝了该请求。
排查解决步骤
替换非标准HTTP方法
ADD不属于IETF定义的标准HTTP方法,绝大多数Web服务器默认会拦截非标准方法返回403。建议你将自定义的ADD方法替换为POST,在请求体中新增action=add参数做业务逻辑判断;如果一定要保留ADD方法,需要手动在Web服务器配置中放开ADD方法的访问限制。处理OPTIONS预检请求
自定义方法的跨域请求会先发送OPTIONS预检请求,若PHP层没有单独处理OPTIONS请求,或者Web服务器拦截了OPTIONS请求,也会返回403。可以在PHP代码最前端增加OPTIONS请求的处理逻辑:
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { http_response_code(200); exit(); }
排查HTTPS站点的访问控制规则
你提到HTTP站点请求无报错,HTTPS站点报错,大概率是你的Web服务器针对HTTPS虚拟主机单独配置了请求方法限制,或者HTTPS站点配置了CSRF校验规则,拦截了非GET的跨站请求,可检查对应的站点配置文件做调整。优化CORS配置
你当前使用*通配符允许所有源存在安全风险,建议改为根据请求Origin动态返回允许的域名,配置示例如下:
$allowOrigin = [ 'http://www.mywebsite.com', 'https://mywebsite.com', 'https://www.mywebsite.com' ]; if (isset($_SERVER['HTTP_ORIGIN']) && in_array($_SERVER['HTTP_ORIGIN'], $allowOrigin)) { header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']); header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS'); header('Access-Control-Allow-Headers: Content-Type, x-requested-with'); // 如果需要传递Cookie可以加下面这行 // header('Access-Control-Allow-Credentials: true'); }
内容的提问来源于stack exchange,提问作者Matthieu Marcé
相关产品推荐
相关产品推荐

