nginx 301重定向是网站重构域名跳转最稳妥方式,推荐用return指令实现精准、稳定、带参跳转,避免rewrite与if嵌套等常见错误。

网站重构时做域名跳转,核心目标是把旧域名的流量和SEO权重平稳迁移到新域名,Nginx 的 301 重定向是最稳妥的方式。关键不是“能不能跳”,而是“跳得准、跳得稳、不丢参数、不循环”。
用 return 指令最简洁可靠
这是推荐首选方式,语法干净、性能高、无正则开销,且天然避免 rewrite 带来的多级匹配或变量误解析问题。
比如把 old-site.com 全量跳到 new-site.com:
server {
listen 80;
server_name old-site.com www.old-site.com;
return 301 https://new-site.com$request_uri;
}
-
$request_uri保留原始路径和查询参数(如/blog?id=123→/blog?id=123) - 如果新站也走 HTTPS,这里直接写
https://;若仍为 HTTP,改为http://new-site.com$request_uri - 不要在该 server 块里配置 root、index 或 PHP 相关指令——它只负责跳转,不提供页面
多个旧域名合并到一个新域名
常见于品牌升级或主域名统一(如 site.cn、www.site.cn、site.com 全部归集到 www.site.com):
server {
listen 80;
server_name site.cn www.site.cn site.com;
return 301 https://www.site.com$request_uri;
}
- 多个域名用空格分隔,全部命中此块即跳转
- 若需区分协议(如旧站只有 HTTP),可再加一个监听 443 的 server 块,同样 return 到新站 HTTPS 地址
子目录或路径结构调整也要带参数迁移
比如旧站 /product/123.html 要映射到新站 /item/123/,且保留 UTM 等追踪参数:
location ^~ /product/ {
rewrite ^/product/(\d+)\.html$ /item/$1/? permanent;
}
但更推荐用 return 配合正则捕获(Nginx 1.11.8+ 支持):
location ~ ^/product/(\d+)\.html$ {
return 301 https://www.site.com/item/$1/?$args;
}
-
$args显式拼接查询字符串,比$request_uri更可控(避免编码重复) -
?后加$args可确保?utm_source=xx正确传递
务必避开的坑
- ❌ 不要用
rewrite+if嵌套处理域名跳转(易触发 Nginx 的 if-is-bad-practice 问题,导致不可预期行为) - ❌ 不要遗漏
$request_uri或$args,否则跳转后丢失路径或参数,用户看到首页而非原内容页 - ❌ 不要在跳转 server 块中启用 SSL(listen 443 ssl),HTTP 跳转块必须纯 80 端口,否则配置校验失败
- ✅ 每次改完运行
nginx -t校验语法,再nginx -s reload生效 - ✅ 用 curl 测试:
curl -I http://old-site.com/some/path,确认响应头含Location: https://...和301状态码
不复杂但容易忽略细节。











