PHP跨域被拒本质是浏览器拦截,需正确配置CORS响应头并处理OPTIONS预检请求:在脚本开头设置Access-Control-Allow-Origin、Methods、Headers三头,对OPTIONS返回204,传Cookie时禁用*并启用Allow-Credentials,推荐动态校验Origin白名单。

PHP跨域被拒,本质是浏览器拦的,不是PHP拒绝——它只是没告诉浏览器“可以放行”。加CORS头是最直接、标准的解法,但光写header("Access-Control-Allow-Origin: *")往往不够,容易踩坑。
必须加的核心响应头
这三行要放在PHP脚本最开头(任何echo、空格、BOM之前):
-
Access-Control-Allow-Origin:开发可暂用
*,上线必须换成具体域名,比如https://your-app.com -
Access-Control-Allow-Methods:列出前端真会用的方法,如
GET, POST, PUT, DELETE, OPTIONS -
Access-Control-Allow-Headers:覆盖前端发的自定义头,常见有
Content-Type, Authorization, X-Requested-With
OPTIONS预检请求必须单独处理
带Authorization头、Content-Type: application/json或用PUT/DELETE时,浏览器会先发一次OPTIONS。不响应它,后续请求根本发不出。
- 在所有业务逻辑前加判断:
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(204); exit; } - 用
204 No Content比exit(0)更规范,明确告诉浏览器“预检通过,无正文”
需要传Cookie或Session?注意两个硬约束
如果前端设置了credentials: 'include'(或xhr.withCredentials = true),后端必须:
立即学习“PHP免费学习笔记(深入)”;
- 把
Access-Control-Allow-Origin设为具体域名,不能是* - 显式加头:
Access-Control-Allow-Credentials: true - 建议同时加
Vary: Origin,避免CDN或代理缓存错乱
更安全的做法:动态校验来源
不信任*,也不硬编码单个域名?可以用白名单动态匹配:
- 读取
$_SERVER['HTTP_ORIGIN'],检查是否在允许列表里(如['https://a.com', 'https://b.net']) - 匹配成功才输出
Access-Control-Allow-Origin: $origin - 这样既防恶意调用,又支持多环境(开发/测试/生产不同域名)
不复杂但容易忽略:header必须在任何输出前调用,且OPTIONS请求必须终止执行。做到这几点,90%的跨域报错就消失了。



















