Nginx 301重定向核心目标是精准、完整、永久地将旧URL导向对应新URL,保留路径和参数以保障访问与SEO平稳过渡;涵盖单页迁移、整站换域、目录变更、主域名统一、批量路径替换五类场景,均提供可复制配置及关键注意事项。

网站改版旧址迁移时,Nginx 的 301 重定向核心目标是:把所有旧 URL 请求,精准、完整、永久地导向对应的新 URL,同时不丢失路径和参数,保障用户访问和 SEO 权重平稳过渡。
下面分几种典型场景,直接给出可复制、少出错的配置方式:
单页面迁移(如 /old.html → /new-page.html)
适合个别页面结构调整。用 return 301 最简洁高效,不触发正则匹配开销:
location = /old.html {
return 301 /new-page.html;
}注意:= 表示精确匹配,只对 /old.html 生效;若需保留查询参数(如 ?ref=abc),写成:
return 301 /new-page.html?$args;
整站域名更换(如 old.com → new.com)
推荐在旧域名的 server 块中统一处理,确保所有路径+参数原样传递:
server {
listen 80;
server_name old.com www.old.com;
return 301 https://new.com$request_uri;
}✅ $request_uri 自动包含路径和完整查询字符串(如 /blog/2024/post?id=123)
⚠️ 不要用 rewrite + permanent,return 更轻量、更可靠
目录结构变更(如 /product/123 → /item/123)
用 rewrite 配合正则提取关键部分,再构造新路径:
location /product/ {
rewrite ^/product/(\d+)(?:/.*)?$ /item/$1 permanent;
}说明:
-
^/product/(\d+)匹配/product/数字开头的请求 -
(?:/.*)?是非捕获组,兼容/product/123和/product/123/detail -
$1引用第一个括号捕获的数字,拼成/item/123
强制统一主域名(如 www → 非 www 或反之)
以“强制跳转到裸域名”为例(www.example.com → example.com):
server {
listen 80;
server_name www.example.com;
return 301 http://example.com$request_uri;
}同理,若主域名是 www.example.com,就把 example.com 的 server 块按同样逻辑反向配置。
批量路径替换(如所有 /old/ 开头 → /new/)
简单替换无需复杂逻辑,直接用 rewrite:
location /old/ {
rewrite ^/old/(.*)$ /new/$1 permanent;
}它会把 /old/about → /new/about,/old/api/v1 → /new/api/v1,自动保留后续全部内容。
配置完别忘了:
- 检查语法:
nginx -t - 重载生效:
nginx -s reload(或systemctl reload nginx) - 用 curl 测试:
curl -I http://old.com/xxx看是否返回301及正确的Location头
不复杂但容易忽略细节,关键是路径匹配要准、参数要留全、状态码必须是 301。


















