nginx虚拟主机重定向需写在对应server块内,通过listen和server_name唯一标识,推荐用return 301/302实现高效跳转,注意$request_uri保留路径参数,避免location覆盖或server_name重复导致失效。

在 Nginx 中配置 Virtual Host(虚拟主机)时做重定向,核心是把重定向逻辑写在对应的 server 块里,而不是全局或错误位置。关键不在于“能不能”,而在于“在哪写、怎么写才生效”。
明确 server_name 和监听端口
每个 Virtual Host 必须有唯一标识,通常靠 server_name 和 listen 组合区分:
-
listen 80;表示监听 HTTP 默认端口 -
server_name example.com www.example.com;表示这个块只处理这两个域名的请求 - 若要支持 HTTPS 重定向,需额外配
listen 443 ssl;并加载证书
用 return 指令做简单、高效的重定向
这是最推荐的方式——轻量、无正则开销、直接返回状态码:
-
return 301 https://newdomain.com$request_uri;—— 永久跳转,保留原始路径和参数 -
return 302 http://backup-site.com/;—— 临时跳转,固定目标地址 - 注意:
$request_uri包含完整路径+查询参数,比$uri更稳妥
用 rewrite 配合 break 或 redirect 标志
适合需要路径改写或条件判断的场景,但要注意标志含义:
-
rewrite ^/(old|legacy)/(.*)$ /new/$2 permanent;→ 返回 301,浏览器地址栏会变 -
rewrite ^/api/v1/(.*)$ /api/v2/$1 break;→ 内部重写,用户无感知(不是重定向) - 加
last会重新匹配 location;加redirect等价于permanent
避免常见陷阱
重定向失效或循环,往往源于配置顺序或作用域错位:
- 不要把
return放在location /里又没加^~或精确匹配,否则可能被更宽泛的 location 覆盖 - 多个 server 块监听同一端口时,
server_name必须不重复,否则 Nginx 会按字典序选第一个作为默认 host - 如果用
try_files处理 SPA,它本身不触发重定向,只是内部回退;真要跳转还得靠return或rewrite











