旧网址平滑迁移新网址应分场景选指令:整站换域名用return 301,目录结构调整用rewrite提取关键段,单页迁移用location = + return;务必验证语法、响应头及缓存。

旧网址平滑迁移到新网址,核心是让用户和搜索引擎无感过渡:输入旧地址,自动跳到对应的新地址,路径和参数一个不丢,SEO权重不流失。Nginx 里最稳妥、最常用的方式不是靠 rewrite + permanent 硬套,而是分场景选对指令——优先用 return 301,只在需要路径解析时才用 rewrite。
整站换域名:用 return 301 最稳
比如 old-site.com 全量迁到 new-site.com,所有页面都要跟着走:
- 在旧域名的 server 块中(listen 80)写:
return 301 https://new-site.com$request_uri; - $request_uri 包含完整路径和 ? 后面的参数,比如 /blog/2024?id=88 → 自动变成 https://new-site.com/blog/2024?id=88
- 多个旧域名(old1.com、www.old1.com、old2.net)可合并写:
server_name old1.com www.old1.com old2.net;,一条 return 覆盖全部
目录结构调整:用 rewrite 提取关键段
当路径前缀变了,但后面 ID 或 slug 保持不变,比如 /article/123 → /post/123:
- 用 location 精确圈定范围,避免误伤静态资源:
location /article/ {
rewrite ^/article/(\d+)(?:/.*)?$ /post/$1 permanent;
} - 正则 ^/article/(\d+) 捕获数字,$1 就是那个 ID;(?:/.*)? 兼容 /article/123 和 /article/123/detail
- 不用 if + rewrite,更安全;permanent 标志直接发 301,不依赖 rewrite 模块额外配置
单页迁移或路径微调:用 location = + return 最轻量
个别页面改名,比如 /about-us.html → /about.html,不需要正则开销:
-
location = /about-us.html {
return 301 /about.html?$args;
} - = 表示精确匹配,只对这个 URL 生效;?$args 显式保留查询参数(如 ?utm_source=ad)
- 比 rewrite ^/about-us\.html$ /about.html permanent; 更快、更直观
验证和上线前必做三件事
- 运行 nginx -t 检查语法,通过再 reload
- 用 curl -I http://old-site.com/some-path?x=1 看响应头:必须有 301 Moved Permanently 和正确的 Location 值
- 浏览器测试前清空缓存,或先用 302 测试逻辑,确认无误后再切回 301


















