Angular调用PHP注册接口报CORS错误但登录接口正常求助排查
问题排查与解决方案
核心原因(90%概率):未处理跨域预检OPTIONS请求
浏览器在发送非简单跨域POST请求前,会先发送OPTIONS方法的预检请求校验跨域权限,你的现有代码只处理了POST请求,非POST请求直接返回503状态码且不会正常返回CORS头,导致预检直接被跨域策略拦截。
登录接口正常是因为它刚好符合简单请求规则,没有触发预检流程。
修复步骤
1. 新增OPTIONS请求处理逻辑
修改注册接口PHP代码,在所有业务逻辑前优先处理预检请求:
<?php error_reporting(E_ALL); ini_set('display_errors', 1); // 所有请求统一前置返回CORS头 header("Access-Control-Allow-Origin: *"); header("Access-Control-Max-Age: 3628800"); header("Access-Control-Allow-Methods: POST, OPTIONS"); // 新增OPTIONS允许方法 header("Content-Type: application/json; charset=UTF-8"); header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"); // 预检请求直接返回200结束 if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit(); } // 后续原有业务逻辑保持不变 include_once("../config/db.php"); // ... 剩下的原有代码
2. 其他可能问题排查
- 检查
db.php、Users.php等引入文件的PHP标签前后是否有多余空格/输出,会导致header函数执行失败,CORS头无法正常返回 - 确认Angular全局请求拦截器没有给注册接口额外添加自定义请求头,如果有需要把对应的头名称添加到
Access-Control-Allow-Headers列表中 - 调试时可以先把所有错误场景的CORS头强制带上,避免非2xx状态码下CORS头缺失导致的跨域报错掩盖实际业务错误
内容的提问来源于stack exchange,提问作者user14724102
相关产品推荐
相关产品推荐

