如何解决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
相关产品推荐
相关产品推荐

