PHP跨域CORS报错:预检请求未通过HTTP 200状态校验求解决
解决方案
问题出在预检请求(OPTIONS)未被正确处理:浏览器在发送实际POST请求前会自动发送OPTIONS预检请求,你的PHP代码没有针对性处理该请求,且重复设置HTTP状态头导致响应异常。
修改后的PHP代码
// 优先处理OPTIONS预检请求 if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { header("Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization"); header('Access-Control-Allow-Methods: POST, GET, PUT, DELETE'); // 注意:若需携带Cookie,需将*替换为前端具体域名(如http://localhost:4200) header('Access-Control-Allow-Origin: *'); // 若不需要Cookie验证,可删除此行 header('Access-Control-Allow-Credentials: true'); header("Access-Control-Max-Age: 60"); header("HTTP/1.1 200 OK"); exit; // 预检请求无需执行后续逻辑,直接终止脚本 } // 处理POST上传请求 header('Content-Type: application/json; charset=utf-8'); // 与OPTIONS中的Origin保持一致 header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Credentials: true'); // 此处编写文件上传的业务逻辑...
关键注意事项
- 单独处理OPTIONS请求:预检请求仅需返回CORS头和200状态码,必须用
exit终止脚本,避免执行后续上传逻辑。 - 修正冲突配置:
Access-Control-Allow-Origin: *和Access-Control-Allow-Credentials: true不能同时生效。若需携带Cookie(如会话信息),需将*替换为前端具体域名;若无需Cookie,直接删除Access-Control-Allow-Credentials行。 - 移除重复状态头:原代码中重复设置
HTTP/1.1 200 OK、HTTP/2 200 OK会导致响应头混乱,仅保留一行即可。
Angular端配套调整(若需Cookie验证)
如果请求需要携带Cookie,需在请求配置中添加withCredentials: true:
const req = new HttpRequest('POST', `${this.baseUrl}/uploads/upload.php`, formData, { reportProgress: true, responseType: 'json', withCredentials: true // 仅当需要Cookie时添加 }); return this.http.request(req);
内容的提问来源于stack exchange,提问作者Alisson Maciel
相关产品推荐
相关产品推荐

