FastCGI 不处理重定向,重定向由 Nginx 控制;后端硬编码旧域名会导致错误 Location 头,应通过 fastcgi_hide_header 隐藏并由 Nginx 用 add_header 或 return 统一接管,或改用相对路径跳转、传递 SERVER_NAME 参数、map 指令兜底,最后用日志和 curl 验证。

FastCGI 本身不处理重定向,它只是把 PHP 或其他后端应用的响应传给 Nginx。真正控制重定向行为的是 Nginx 配置层——尤其是当域名变更时,后端(比如 PHP)如果硬编码了旧域名、或通过 $_SERVER['HTTP_HOST'] 构造跳转地址,就容易返回错误的 Location 响应头,导致 301/302 跳转到旧域名。
后端输出的重定向响应必须由 Nginx 拦截并重写
PHP 等 FastCGI 应用在生成重定向(如 header("Location: http://old.com/login"))时,若未适配新域名,会直接把含旧域名的 Location 头发给客户端。Nginx 无法自动“修正”这类响应,但可以主动拦截并覆盖:
- 使用
proxy_redirect(仅适用于反向代理场景,不适用于 FastCGI)→ 不适用 - 正确做法:用
fastcgi_hide_header隐藏原始 Location,再用add_header+return或rewrite ... redirect主动控制跳转 - 更稳妥的方式:禁止后端输出 Location,改由 Nginx 统一接管所有重定向逻辑
确保 PHP 不再输出含旧域名的 Location 头
检查 PHP 代码中是否出现类似以下写法:
header("Location: http://old.com" . $_SERVER['REQUEST_URI']);这类代码必须清理或重构。推荐做法:
- 统一使用相对路径跳转:
header("Location: /login")(Nginx 会自动补全协议+主机) - 或通过环境变量注入新域名,在 PHP 中读取:
$_SERVER['HTTP_X_FORWARDED_HOST']或自定义FASTCGI_PARAM - Nginx 配置中可传递可信域名:
fastcgi_param SERVER_NAME new.com;,供 PHP 安全拼接
用 Nginx 的 map 指令动态映射 Host 到新域名
当存在多个旧域名需统一跳转到一个新域名,且部分跳转来自后端响应时,可用 map 提前标准化:
map $host $redirect_host {
default "new.com";
~*^old\.com$ "new.com";
~*^www\.old\.com$ "new.com";
}
server {
listen 80;
server_name old.com www.old.com;
return 301 https://$redirect_host$request_uri;
}这样即使后端某处仍拼错 Host,Nginx 层已强制兜底,所有入口都归一到新域名。
验证 FastCGI 响应头是否被干净拦截
加一条临时日志,确认 Nginx 是否收到并丢弃了错误 Location:
log_format redirect_log '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$sent_http_location"';
access_log /var/log/nginx/redirect.log redirect_log;然后用 curl -I http://old.com/some-path 查看响应头中 Location: 是否已被替换为新域名。


















