Nginx端口转发场景下PHP header Location跳转端口错误解决方法
问题根因
该问题和PHP header() 函数的写法无关,核心是两层逻辑叠加导致跳转端口被强制改写:
- Nginx本地监听2443端口承载HTTPS流量,默认将自身服务端口识别为2443,且默认开启
port_in_redirect规则,会自动拦截、修改后端返回的Location响应头,将头内的端口替换为自身监听的2443,你在PHP代码里手动写的带443端口、不带端口的跳转地址都会被该规则覆盖。 - Nginx默认向PHP-FPM传递的
$_SERVER['SERVER_PORT']参数取值为自身监听的2443,PHP内部处理跳转逻辑时也会基于该参数补全URL端口,进一步导致跳转地址异常。
修复步骤
所有修改均在服务端配置层面完成,不需要调整业务PHP代码。
1. 修改Nginx站点配置
找到你域名对应的Nginx server配置块(即监听2443端口的HTTPS配置段),添加/修改以下配置:
server { listen 2443 ssl http2; server_name domain.tld; # 关闭Nginx自动改写重定向端口的逻辑 port_in_redirect off; server_port_in_redirect off; # 站点根目录、SSL证书等原有配置保持不变 # root /var/www/xxx; # ssl_certificate /path/xxx.pem; # ssl_certificate_key /path/xxx.key; location ~ \.php$ { include fastcgi_params; fastcgi_pass unix:/run/php/php7.4-fpm.sock; # 替换为你实际的PHP-FPM监听地址 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 核心:覆盖传递给PHP的端口参数,强制告知PHP对外服务端口为443 # 注意:这两行必须写在include fastcgi_params之后,否则会被默认配置覆盖 fastcgi_param SERVER_PORT 443; fastcgi_param HTTPS on; } # 其他原有location配置保持不变 }
2. 校验并重载服务
执行以下命令校验配置、重载服务生效:
# 校验Nginx配置语法是否正确 nginx -t # 校验通过后重载Nginx systemctl reload nginx # 重载PHP7.4-FPM systemctl reload php7.4-fpm
验证
配置生效后,任意PHP脚本中使用header('Location: /page')这类站内跳转写法,返回的响应头中Location地址将不再携带2443端口,公网访问可正常跳转。
之前尝试的三种header写法不生效的原因,就是Nginx层的端口改写优先级高于PHP返回的响应头,在Nginx层拦截修改了最终返回给用户的跳转地址,仅调整PHP代码无法解决该问题。
内容的提问来源于stack exchange,提问作者wreeper
相关产品推荐
相关产品推荐

