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

PHP添加HTTP响应码后Axios跨域报错的解决求助

问题解决:添加自定义HTTP响应码后CORS跨域错误

问题根源

浏览器发送POST请求前会自动发起OPTIONS预请求,用于验证跨域权限。你的PHP接口未单独处理OPTIONS请求,直接返回了400状态码,导致预请求未通过CORS检查,进而拦截了后续的实际POST请求。而Postman不会发送预请求,所以能正常调用接口。

解决方案

1. 优先处理OPTIONS预请求

在接口开头判断请求方法,若为OPTIONS则直接返回200状态码和完整CORS头,确保预请求通过。

2. 所有响应都携带CORS头

不管是成功还是错误响应,都要设置正确的跨域允许头,避免被浏览器拦截。

3. 仅在业务逻辑中返回自定义响应码

确保自定义响应码只在实际POST请求的业务判断中返回,不影响预请求。

修改后的login.php示例代码

<?php
// 先处理OPTIONS预请求,确保跨域验证通过
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    header('Access-Control-Allow-Origin: http://localhost:3000');
    header('Access-Control-Allow-Methods: POST, OPTIONS');
    header('Access-Control-Allow-Headers: Content-Type');
    http_response_code(200);
    exit;
}

// 为POST请求设置CORS头和响应格式
header('Access-Control-Allow-Origin: http://localhost:3000');
header('Content-Type: application/json');

// 登录业务逻辑
try {
    $email = $_POST['email'] ?? '';
    $password = $_POST['password'] ?? '';

    if ($email === '合法邮箱' && $password === '正确密码') {
        http_response_code(200);
        echo json_encode(['status' => 'success', 'user' => ['id' => 1, 'email' => $email]]);
    } else {
        http_response_code(400);
        echo json_encode(['status' => 'error', 'message' => '邮箱或密码错误']);
    }
} catch (Exception $e) {
    http_response_code(500);
    echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
}
?>

Axios请求代码无需调整

你的前端请求逻辑没有问题,故障完全源于后端对预请求的处理缺失。

内容的提问来源于stack exchange,提问作者user19210100

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 01:10:27