Nginx 中用 rewrite 实现旧域名平滑迁移需配置独立 server 块监听旧域名,仅含 rewrite ^(.*)$ https://new.example.com$1 permanent; 保持路径与参数,禁用静态服务,分 HTTP/HTTPS 块配置,上线前验证 DNS、SSL 和配置语法。

在 Nginx 中用 rewrite 实现旧域名平滑迁移跳转,核心是让所有旧域名请求 301 重定向到对应的新域名 URL,同时保留完整路径和查询参数。关键不是简单换域名,而是保持 URL 结构一致,避免 SEO 损失和用户访问中断。
配置 server 块监听旧域名
为旧域名单独定义一个 server 块,明确绑定 server_name,并关闭其他可能干扰的配置(如 root、index):
- 确保该 server 块不启用任何静态文件服务或代理逻辑
- 只做跳转,不处理业务,避免缓存或日志污染主站
- 若旧域名有多个变体(如带 www 和不带 www),可统一收口到一个 server 块中
用 rewrite 实现全路径 301 跳转
在旧域名的 server 块中添加如下 rewrite 规则:
rewrite ^(.*)$ https://new.example.com$1 permanent;
说明:
-
^(.*)$匹配任意路径(包括 /、/a/b、/api?x=1) -
$1引用捕获的完整路径+查询串,Nginx 默认保留 query string -
permanent等价于 301,告诉浏览器和搜索引擎这是永久迁移 - 注意:不要写成
redirect(302),否则搜索引擎不会更新索引
处理 HTTPS 和端口等边界情况
如果旧域名曾使用非标准端口或混合 HTTP/HTTPS,需额外适配:
- 若旧站强制跳 HTTPS,但新站也走 HTTPS,rewrite 中直接写
https://即可 - 若旧域名同时支持 HTTP 和 HTTPS,建议两个 server 块分别配置,都指向同一 rewrite
- 避免在 rewrite 中拼接
$scheme或$host——容易出错且没必要;固定新域名更安全 - 测试时用
curl -I http://old.example.com/path?a=1确认返回 301 及Location: https://new.example.com/path?a=1
上线前必须验证的三件事
迁移不是加完配置就完事,要确认:
- 旧域名 DNS 已解析到当前 Nginx 服务器(否则 rewrite 不生效)
- 新域名 SSL 证书已正确部署(否则跳转后页面打不开)
- 检查 Nginx 配置语法:
nginx -t,重载:nginx -s reload
不复杂但容易忽略。











