重定向响应中的CORS头会被浏览器忽略,因重定向是客户端发起的新请求,原响应头不传递;必须在重定向目标地址的服务端设置Access-Control-Allow-Origin等CORS头,且PHP重定向后须立即exit防止输出干扰。

重定向响应里CORS头会被浏览器忽略
PHP中用 header('Location: ...') 做302重定向时,即使你在重定向前手动设置了 Access-Control-Allow-Origin 等CORS头,浏览器也不会将这些头应用到重定向后的请求上——因为重定向是客户端发起的新请求,服务端对原始响应设置的CORS头只作用于该响应本身,不传递给跳转后的目标地址。
必须在重定向目标地址的服务端设置CORS头
跨域重定向能否成功,取决于重定向最终抵达的那个URL(即 Location 指向的地址)是否自己返回了合法的CORS响应头。PHP脚本无法“携带”或“转发”CORS头过去。
- 如果目标是同域资源,无需CORS,直接重定向即可
- 如果目标是第三方API(如
https://api.example.com/auth/callback),必须确保该API服务端明确返回Access-Control-Allow-Origin、Access-Control-Allow-Credentials(如需cookie)等头 - 若你控制目标服务,就在其PHP入口(如
callback.php)开头加上:header('Access-Control-Allow-Origin: https://your-frontend.com'); header('Access-Control-Allow-Credentials: true');
避免前端JavaScript触发跨域重定向
前端用 fetch() 或 XMLHttpRequest 发起请求时,如果响应是302且目标跨域,浏览器会自动跟随重定向,但**不会暴露重定向过程中的响应头**,更不会把CORS检查延伸到跳转链中间节点。此时前端拿不到重定向后的响应体,也收不到CORS错误提示,容易误判为“请求卡住”或“空响应”。
- 不要让前端AJAX请求依赖跨域重定向来获取数据;改用服务端代理(如PHP cURL转发)
- 若必须前端跳转,改用
window.location.href = 'https://other-domain.com/login',由用户主动导航,绕过CORS限制 - 检查Network面板:若看到302响应状态码后紧跟着一个跨域的200,但JS拿不到响应内容,基本可确认是CORS+重定向导致的静默失败
PHP header() 之后输出内容会导致重定向失效
常见误操作:在 header('Location: ...') 后仍继续执行PHP逻辑,甚至输出HTML或调用 echo,这会让重定向变成无效(HTTP状态码可能变成200,或触发“headers already sent”错误)。
立即学习“PHP免费学习笔记(深入)”;
- 务必在
header()后立即exit或die - 错误写法:
header('Location: https://other.com/callback'); echo 'done'; // 这会导致重定向失败 - 正确写法:
header('Location: https://other.com/callback'); exit; - 如果用了输出缓冲(
ob_start()),需确保重定向前未输出任何内容,否则header()会失败











