nginx 301重定向核心目标是精准、无损、可维护地映射新旧url并保障seo权重平稳过渡;需先建映射表,优先用return处理简单跳转,路径变化用rewrite正则,严防循环跳转与配置混用。

全站改版链接迁移时,Nginx 的 301 重定向核心目标是:**精准、无损、可维护地把旧 URL 映射到新 URL,同时确保搜索引擎权重平稳过渡**。不能靠“全站跳首页”或模糊匹配,否则会丢失大量长尾流量和历史收录。
明确重定向范围与映射关系
改版前必须先整理出完整的 URL 映射表(CSV 或 Excel),包含三列:旧路径、新路径、是否保留参数。例如:
- /article/123.html → /posts/2023/123(结构变更,需正则捕获)
- /product?id=456 → /items/456(GET 参数转路径,需 rewrite + $arg_id)
- /old-category/ → /new-category/(目录级批量迁移)
没有映射表就写配置,等于在生产环境盲投——后期排查 404 和权重流失会非常被动。
优先用 return 指令处理简单跳转
对域名变更、协议升级、或固定路径一对一跳转,直接用 return 301,性能高、逻辑清晰、不易出错:
-
HTTP → HTTPS 全站跳转:
return 301 https://$host$request_uri; -
www → 非 www(或反之):
if ($host = 'www.example.com') { return 301 https://example.com$request_uri; } -
旧域名 → 新域名:
return 301 https://new-site.com$request_uri;
注意:$request_uri 必须保留,它含路径+查询参数;用 $uri 会丢掉 ?utm_source=xxx 这类参数。
用 rewrite + permanent 处理路径结构变化
当旧路径和新路径存在规律性差异(如目录名、ID位置、后缀变化),用 rewrite 正则更灵活:
-
文章路径从 /a/123.html → /post/123:
rewrite ^/a/(\d+)\.html$ /post/$1 permanent; -
分类页带分页参数 /cat/news/page/2 → /category/news?p=2:
rewrite ^/cat/([^/]+)/page/(\d+)$ /category/$1?p=$2 permanent; -
统一移除 .php 后缀:
rewrite ^/(.*)\.php$ /$1 permanent;
关键点:permanent 标志等效于 301;捕获组用 (),引用用 $1、$2;结尾不加斜杠时,$1 不会自动补,要手动加。
避免常见陷阱
这些错误会导致跳转失败、循环重定向或 SEO 权重中断:
- 不要混用 rewrite 和 return 在同一 location 中——return 会立即终止处理,rewrite 不再执行
- HTTPS server 块里别写 return 301 到 HTTPS——会造成循环(https → https)
-
location 匹配要精确:比如
location /old/ { ... }会匹配 /old/sub/,但location = /old只匹配裸路径 - 测试必须用 curl -I 查状态码,别只看浏览器跳转——浏览器可能缓存了旧 301,导致误判
改版上线前,在 staging 环境用真实旧 URL 批量验证返回头,确认 status 是 301、Location 值准确、无多余跳转链。











