server_name_in_redirect控制重定向时Location头中域名来源:on时强制用server_name首个域名,off时优先用请求Host头;默认off,推荐显式设为off以保持用户原始访问域名。

重定向时域名“变掉了”,比如用户访问 https://www.example.com/admin,结果跳到了 https://example.com/admin/,甚至跳到 http://localhost/admin/——这通常不是 rewrite 或 return 写错了,而是 server_name_in_redirect 在起作用。它不决定要不要跳转,只决定跳转地址里的域名用谁的。
它到底控制什么
当 Nginx 自动发起重定向(如目录补斜杠、rewrite ... permanent、try_files 触发跳转),需要拼一个完整 URL 放进 Location 响应头。这时:
-
设为 on:强制使用当前
server块中server_name列表的第一个域名,比如server_name example.com www.example.com;→ 永远用example.com -
设为 off:优先采用客户端请求里的
Host头,比如用户输的是www.example.com,就跳回www.example.com;Host缺失时才退回到服务器 IP
为什么推荐显式设为 off
多数真实场景依赖用户原始访问的 Host,设为 on 容易引发问题:
- HTTPS 证书不匹配:用户访问
https://shop.myapp.com,却被跳到https://myapp.com,而证书只覆盖shop.*,浏览器直接拦截 - Cookie 域名失效:登录态存在
.myapp.com,跳转后请求发向myapp.com(无点),Cookie 不携带,用户意外登出 - 本地调试失败:开发机配了
server_name localhost;,但同事用http://192.168.1.50:8080/app访问,结果重定向到http://localhost:8080/app/,打不开
怎么正确配置
在对应 server 块里加上这一行即可,无需改动其他逻辑:
- 显式写
server_name_in_redirect off;—— 即使新版默认是 off,也建议写明,避免版本差异或继承干扰 - 确保反向代理透传 Host 头:如果前面有 CDN、负载均衡器或 Nginx 反代,必须加
proxy_set_header Host $host;或proxy_set_header Host $http_host;,否则后端收不到原始 Host - 注意:该指令只能放在
server或location块中,不能写在http块里,否则无效或报错
哪些重定向会受它影响
它只对 Nginx “自动补全”的重定向生效:
- ✅ 有效:
rewrite ^/old(.*)$ /new$1 permanent;、try_files $uri $uri/ =404;补斜杠、return 301 /path;(路径不带协议) - ❌ 无效:
return 301 https://$host$request_uri;或rewrite ... redirect中明确写了完整 URL,此时 Location 完全由你控制 - ⚠️ 协同设置:
port_in_redirect off;可避免非标端口(如 :8080)被错误省略或硬塞 :80/:443


















