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

如何解决PHP接口的CORS错误?(跨域请求失败)

解决跨域CORS请求失败问题

先给你揪出核心矛盾:Postman调用正常,但网站请求报错,是因为浏览器发起跨域请求时,会先发送一个OPTIONS预检请求,而你当前的代码只处理了GET请求,完全没响应这个OPTIONS请求,所以浏览器直接拦截了后续的GET请求。Postman不会自动发预检请求,这就是两者表现差别的原因。

第一步:先处理OPTIONS预检请求

修改你的log.php,在处理GET逻辑前,先判断请求方法是不是OPTIONS,如果是直接返回成功状态码就行:

// required headers
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Max-Age: 1000");
header("Access-Control-Allow-Headers: X-Requested-With, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding");
header("Access-Control-Allow-Methods: PUT, POST, GET, OPTIONS, DELETE");
header("Content-Type: application/json; charset=UTF-8");

// 优先处理OPTIONS预检请求
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit();
}

// database connection will be here
include_once '../database.inc';
include_once '../models/Log.php';

if ($_SERVER['REQUEST_METHOD'] === 'GET') {
    // 原有的GET请求处理逻辑...
}

这样浏览器的预检请求能拿到合法响应,后续的GET请求就能顺利执行了。

第二步:紧急修复SQL注入漏洞!

你的Log.php里的read方法直接把$id拼进SQL语句,这等于给数据库开了个后门,恶意用户随便构造个id就能篡改你的查询,必须改成参数绑定:

function read($id) {
    $query = "SELECT * FROM " . $this->table_name;
    if ($id != '-1') {
        // 用占位符替代直接拼接
        $query .= " WHERE ID = :id";
    }
    // prepare query statement
    $stmt = $this->conn->prepare($query);
    // 绑定id参数(如果需要)
    if ($id != '-1') {
        $stmt->bindParam(':id', $id);
    }
    // execute query
    $stmt->execute();
    return $stmt;
}

这个修复非常重要,别等数据库出问题了才后悔!

额外排查点

  • 检查服务器配置(比如Apache/Nginx)有没有拦截或覆盖你设置的CORS响应头
  • 打开浏览器控制台的网络面板,看OPTIONS请求的响应状态码是不是200,以及响应头里是否包含你设置的CORS规则

按上面的步骤调整后,你的跨域请求应该就能正常工作了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:57:46