应配置 absolute_redirect off:nginx 1.11.8+ 版本中,在 server 块内设置 absolute_redirect off,可使 return 或 rewrite 生成的重定向返回相对路径(如 /path),由浏览器自动补全当前协议、域名和端口,避免暴露非标端口并确保跳转正确。

在 Nginx 中,当服务器实际运行在非标准端口(如 8080),而前端通过反向代理或防火墙映射到公网 80 或 443 时,若配置了 return 301 或 rewrite ... permanent,Nginx 默认会生成**带端口的绝对重定向 URL**(例如 http://example.com:8080/path),导致浏览器跳转失败或暴露内网端口——这是常见但容易被忽略的安全与可用性问题。
关键参数:absolute_redirect off
从 Nginx 1.11.8+ 开始,推荐使用 absolute_redirect off。它让 Nginx 在生成 Location 响应头时,**不拼接端口**,而是返回协议 + 域名 + 路径的相对形式(如 https://example.com/path),由浏览器自动补全当前访问的端口(即用户实际访问的 80/443)。
- 该指令必须放在
server块内,作用于该虚拟主机下的所有重定向 - 无需配合
port_in_redirect,且更安全、更符合现代部署习惯 - 示例配置:
listen 80;
server_name example.com;
absolute_redirect off;
return 301 https://$server_name$request_uri;
}
兼容旧版本:port_in_redirect off
若 Nginx 版本低于 1.11.8(如 1.10.x),则使用 port_in_redirect off。它会让 Nginx 在重定向时**省略端口号**,仅保留协议和域名(如 https://example.com/path),前提是客户端访问的是默认端口(80/443)。
- 注意:若外部访问端口非 80/443(如 8080 映射到公网 8000),此方式仍可能出错,建议升级 Nginx
- 该指令也需置于
server块中,不可在 http 或 location 级别使用
配合 Host 头确保域名正确
重定向 URL 中的域名来自 $server_name 或 $host。若用户用 IP 直连或 Host 头异常,可能导致跳转到错误域名。建议:
- 用
$host替代$server_name,它取自请求中的 Host 头,更贴近真实访问入口 - 对非预期 Host 做兜底,例如设置
default_server拦截 IP 访问,避免误跳 - 示例:
return 301 https://$host$request_uri;
验证与调试要点
配置生效后务必验证响应头是否干净:
- 用
curl -I http://example.com/some-path查看Location头,确认无内网端口 - 清除浏览器缓存再测试——301 重定向会被强缓存,旧结果可能持续数小时
- 检查日志中是否有
rewrite or internal redirection cycle类报错,说明重写逻辑冲突











