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 响应头里。这时:
-
server_name_in_redirect on:硬用当前
server块中server_name列表的第一个域名,比如server_name example.com www.example.com;→ 永远用example.com -
server_name_in_redirect off(新版默认,但建议显式写):优先用用户请求里的
Host头,比如用户输的是www.example.com,就跳回www.example.com;如果 Host 头缺失,才退回到服务器 IP
为什么 off 是更安全的选择
多数线上场景——多域名托管、CDN 回源、前后端分离调试、Docker 容器映射——都依赖用户真实访问的 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、LB 或 Nginx 反代,必须加
proxy_set_header Host $host;或$http_host;,否则后端收不到原始 Host -
不要把它和强制跳转混用:想统一用 www?别靠这个指令,改用
if ($host = 'example.com') { return 301 https://www.example.com$request_uri; }
哪些重定向它管,哪些不管
它只影响 Nginx 自动拼 URL 的情况,不是所有 301 都听它指挥:
-
受控:目录自动补斜杠(
/admin→/admin/)、rewrite ^/old(.*)$ /new$1 permanent;、try_files $uri @fallback;后的跳转 -
不受控:你手写的完整 URL,比如
return 301 https://$host$request_uri;或return 301 https://mydomain.com/;—— Location 完全由你定义,它插不上手

















