php跨域报错本质是浏览器cors限制,需在php响应中设置合法cors头并正确处理options预检请求:开头用header()设access-control-allow-origin等头,且须在任何输出前;加request_method==='options'判断并返回200;可动态校验origin白名单;或用nginx统一配置。

PHP 接口跨域报错,本质不是 PHP 拦截了请求,而是浏览器出于安全限制,拒绝读取响应内容。解决核心是让 PHP 响应中包含合法的 CORS 头,并正确应对 OPTIONS 预检请求。
在 PHP 脚本开头设置响应头
这是最直接、最常用的方式,适合调试或轻量接口。关键点是:所有 header() 必须在任何输出(包括空格、BOM、echo、HTML)之前调用。
- 允许指定前端域名(推荐生产环境):
header("Access-Control-Allow-Origin: https://your-frontend.com"); - 若需携带 Cookie 或 Token,必须加这一行,且 Origin 不能为 *:
header("Access-Control-Allow-Credentials: true"); - 声明允许的 HTTP 方法(务必含 OPTIONS):
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS"); - 声明前端实际发送的请求头(如 Authorization、Content-Type):
header("Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With");
必须处理 OPTIONS 预检请求
当请求带自定义头、非简单 Content-Type(如 application/json)或使用 PUT/DELETE 方法时,浏览器会先发 OPTIONS 请求。如果 PHP 不响应它,主请求根本不会发出。
- 在所有业务逻辑前加判断:
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit; } - 不要只靠 Nginx/Apache 返回 OPTIONS,PHP 层必须能接收并快速终止,否则 FastCGI 等环境下仍可能失败
动态校验来源域名(更安全)
硬编码 * 或固定域名不够灵活,尤其对接多个前端(如测试、预发、正式)时。可从请求头读取 Origin 并白名单匹配:
- 定义允许列表:
$allowed = ['https://admin.example.com', 'https://app.example.com', 'http://localhost:5173']; - 获取并校验:
$origin = $_SERVER['HTTP_ORIGIN'] ?? ''; if (in_array($origin, $allowed)) { header("Access-Control-Allow-Origin: $origin"); header('Vary: Origin'); } - 搭配 credentials 使用时,此方式天然兼容,无需改前端配置
用 Web 服务器统一配置(减少代码侵入)
适合 API 集中部署、多 PHP 文件共享规则的场景。Nginx 示例(放在 location /api/ 块内):
- add_header 'Access-Control-Allow-Origin' '$http_origin' always;
- add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always;
- add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With' always;
- add_header 'Access-Control-Allow-Credentials' 'true' always;
- 单独匹配 OPTIONS:
if ($request_method = 'OPTIONS') { add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Length' 0; add_header 'Content-Type' 'text/plain; charset=utf-8'; return 204; }
不复杂但容易忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











