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

跨域POST请求触发CORS报错,Access-Control-Allow-Origin缺失如何解决

根因

非简单跨域请求的预检请求未被正确处理:当前发送的POST请求属于需预检的非简单请求,浏览器会先发送OPTIONS方法的预检请求验证跨域权限,现有PHP代码没有对预检请求做单独处理,导致预检请求拿不到正确的CORS响应头,直接被浏览器拦截。

修复步骤

1. 调整postHere.php代码,新增OPTIONS请求处理

修改后的PHP代码如下:

<?php
// 优先处理预检请求
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    switch ($_SERVER['HTTP_ORIGIN']) {
        case 'http://localhost':
        case 'https://localhost':
            header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']);
            header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
            header('Access-Control-Max-Age: 1000');
            header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');
            // 预检请求无需返回业务内容,直接返回204结束请求
            http_response_code(204);
            exit;
    }
}
// 正常业务请求也需要配置跨域头
switch ($_SERVER['HTTP_ORIGIN']) {
    case 'http://localhost':
    case 'https://localhost':
        header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']);
        header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
        header('Access-Control-Max-Age: 1000');
        header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');
        break;
}
// 此处添加你原本的业务逻辑,示例为接收JSON参数并返回
$input = json_decode(file_get_contents('php://input'), true);
echo json_encode(['someKey' => 'testValue', 'receivedData' => $input]);

2. 调整前端AJAX配置,匹配JSON参数格式

当前传递的是JSON格式字符串,但未声明对应Content-Type,会导致后端无法正确解析参数,修改AJAX代码如下:

$.ajax({
    type: 'POST',
    url: 'http://localhost:81/postHere.php',
    crossDomain: true,
    data: JSON.stringify({"some":"json"}),
    // 新增Content-Type声明,告知后端传递的是JSON格式数据
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    success: function(responseData, textStatus, jqXHR) {
        var value = responseData.someKey;
        console.log('请求成功,返回值:', value);
    },
    error: function (responseData, textStatus, errorThrown) {
        alert('POST failed.');
        console.log('错误详情:', errorThrown);
    }
});

3. 额外排查点

  • 确认81端口的Web服务(Apache/Nginx等)没有额外拦截OPTIONS请求,也没有强制添加跨域头覆盖PHP的设置
  • 前端页面不要使用file://协议打开,该场景下HTTP_ORIGIN不存在会匹配不到跨域规则,需将前端页面部署在localhost的Web服务下通过http/https访问
  • 测试时清除浏览器缓存,避免旧的CORS规则缓存影响验证结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:06:03