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

自行搭建的PHP API出现CORS跨域问题 Postman正常但网页端请求报错

本地PHP API接口Postman请求正常、网页端跨域报错问题说明

我自行搭建了用于数据交互的PHP API接口,目前遇到CORS跨域问题:使用Postman请求可以正常返回数据,但网页端应用请求时报错。
控制台报错信息

我已尝试在后端添加如下CORS配置代码:

header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json');
header("Access-Control-Allow-Credentials: true");
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');

添加的CORS配置代码

但添加后仍报相同错误。Postman返回的响应头中已包含上述CORS配置:
Postman响应头

我先后尝试了3种前端请求方式,均报错:

  • 方式1:
axios.get("localhost:1234/getSingersJson.php?test=[144]") 
  • 方式2:
var url = "localhost:1234/getSingersJson.php"; 
var params = "[144]"; 
const xmlhttp = new XMLHttpRequest(); 
xmlhttp.onload = function(){ 
    console.log(this.responseText); 
} 
xmlhttp.open("GET", url + "?test=" + params); 
xmlhttp.send(); 
  • 方式3:
fetch(url + "?test=" + params) 
.then(response => { 
    if(!response.ok) { 
        throw Error(response.statusText); 
    } 
    console.log(response) 
})

各请求方式对应的具体报错如下:

  • fetch请求测试代码:
function api_test(){
    var url = "https://localhost:1234/getSingersJson.php";
    var params = "[144]";
    
    fetch(url + "?test=" + params) 
    .then(response => { 
        if(!response.ok) { 
            throw Error(response.statusText); 
        } 
        console.log(response) 
    })
}

fetch请求报错截图

  • XMLHttpRequest请求测试代码:
function api_test(){
    var url = "https://localhost:1234/getSingersJson.php";
    var params = "[144]";
    
    const xmlhttp = new XMLHttpRequest();
    xmlhttp.onload = function(){
        console.log(this.responseText);
    }
    xmlhttp.open("GET", url + "?test=" + params);
    xmlhttp.send();
}

XMLHttpRequest请求报错截图

开发者工具的Network面板截图如下,请求和响应标签页均无内容:
Network面板截图

补充说明:此前我在本地测试服务器运行该接口时出现上述问题,将PHP文件上传到AWS服务器后接口即可正常运行。


修复方案

1. 修正CORS头配置冲突

当前配置同时设置了Access-Control-Allow-Origin: *和Access-Control-Allow-Credentials: true,二者不符合浏览器规范互斥:携带凭证的跨域请求不允许使用通配符源。如果接口不需要接收Cookie/身份凭证,直接删除header("Access-Control-Allow-Credentials: true");即可;如果需要携带凭证,把*替换为前端页面的完整源地址(和前端部署地址完全匹配,例如http://localhost:5173)。

2. 响应OPTIONS预检请求

浏览器发送正式跨域请求前会先发送OPTIONS类型的预检请求,需要在PHP业务逻辑前提前响应这个请求,直接返回200状态码即可:

// 放在所有业务代码最前面
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    http_response_code(200);
    exit();
}

3. 排查本地测试环境问题

上传到AWS后可正常运行,说明问题出在本地环境:

  • 确认本地PHP服务器1234端口的HTTPS证书是否受浏览器信任,自签未信任的证书会直接被浏览器阻断请求,导致Network面板无内容。也可以统一前端和接口的协议,要么都用HTTP,要么都用受信任的HTTPS。
  • 检查本地Apache/Nginx是否有前置Header配置覆盖了PHP代码设置的CORS头,比如.htaccess文件、Nginx服务配置里的CORS相关规则。

4. 修正前端请求地址

部分测试代码的请求地址缺少协议头,需要补全http://或https://,否则浏览器会将地址识别为当前页面的相对路径,导致请求地址错误。


内容的提问来源于stack exchange,提问作者Young-Kwang Oh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:15:02