You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 21:27:22