You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 19:42:51