php 8.5.5 不内置 cors,跨域完全依赖手动设置响应头:header() 必须在任何输出前调用,必须显式处理 options 预检请求,且 access-control-allow-origin 与 access-control-allow-credentials 必须兼容。

PHP 8.5 本身不内置 CORS 功能,跨域完全靠手动设置响应头,关键在三点:header() 必须在任何输出前调用、必须显式处理 OPTIONS 预检、Access-Control-Allow-Origin 和 credentials 不能冲突。
一、基础 header 设置(必须放在最开头)
在 PHP 文件第一行(php 后立即写),添加以下响应头:
-
Access-Control-Allow-Origin:开发可临时用
header('Access-Control-Allow-Origin: *');;生产环境必须指定域名,例如header('Access-Control-Allow-Origin: https://admin.example.com'); -
Access-Control-Allow-Methods:列出真实用到的方法,如
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS'); -
Access-Control-Allow-Headers:前端实际发送的自定义头都要列全,常见有
Content-Type, Authorization, X-Requested-With -
Access-Control-Allow-Credentials:若前端 fetch 带了
{ credentials: 'include' },此项必须设为true,且 Origin 不能是*
二、必须拦截并响应 OPTIONS 预检请求
浏览器对非简单请求(如含 Authorization 头、Content-Type: application/json、或使用 PUT/DELETE)会先发 OPTIONS 请求。PHP 不自动响应,漏掉就会卡住,后续请求根本不会发出。
在所有 header() 调用之前,加这段逻辑:
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {header('HTTP/1.1 204 No Content');-
header('Access-Control-Allow-Origin: https://admin.example.com');(与主逻辑一致) header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');exit();
三、避免常见踩坑点
这些错误会导致 header 失效,但 PHP 往往不报错,前端只看到“No 'Access-Control-Allow-Origin' header”:
- 文件开头有空格、BOM 字节、UTF-8 签名或 HTML 内容——务必确认以
<?php开头,前面零字符 - 脚本中提前 echo/print/触发错误日志/调用 var_dump ——哪怕一个空格也会让 header() 失败
- 用了 ob_start() 却没检查是否已输出 ——建议上线前用
curl -I http://your-api.com/endpoint直接看响应头 - 前端带 credentials 但后端 Origin 还写
*——浏览器直接丢弃响应,连状态码都看不到
四、更稳的方案:Nginx 层统一配置
绕过 PHP 执行链,从 Web 服务器注入头,彻底规避“headers already sent”问题,适合多入口或静态资源共用策略的场景:
- 在 Nginx 的
location块中加入: add_header 'Access-Control-Allow-Origin' 'https://admin.example.com' always;add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With' always;add_header 'Access-Control-Allow-Credentials' 'true' always;-
add_header 'Vary' 'Origin' always;(防止 CDN 缓存污染)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











