用Nginx独立server块配合return 301是老旧域名无损迁移最稳妥高效的方式,通过分离重定向逻辑、避免if和正则、完整保留$request_uri并统一跳转至HTTPS新域名,兼顾SEO与性能。

用 Nginx 的 server 块配合 return 301 是实现老旧域名无损迁移最稳妥、最高效的方式。核心在于“分离处理”——把重定向逻辑从主站配置中剥离,避免 if 判断、正则匹配等低效操作,直接由 Nginx 在请求进入阶段就完成跳转,既保 SEO 权重,又不增加后端负担。
用独立 server 块做 301 跳转
为每个旧域名单独写一个 server 块,监听 80 或 443 端口,仅包含 return 301 指令:
- 不写 location,不加 rewrite,一行 return 就够
- 使用
$request_uri完整保留原始路径和查询参数,确保链接可追溯 - 目标地址统一用 HTTPS + 新域名,例如:
https://new-site.com$request_uri
同时覆盖 HTTP 和 HTTPS 的旧域名
旧域名可能有 HTTP 和 HTTPS 两个入口,需分别处理:
- HTTP 入口(端口 80):直接
return 301 https://new-site.com$request_uri - HTTPS 入口(端口 443):同样用
return 301,但需提前配置好 SSL 证书,否则浏览器会报错中断跳转 - 若旧域名证书已过期或无法续订,建议只保留 80 端口跳转,并在 DNS 层关闭旧域名的 HTTPS 解析
多旧域名批量迁移的写法
如果有多个旧域名(如 old-a.com、old-b.net、www.old-c.org),不要堆在一个 server 块里判断 host,而是为每个域名建独立 server:
- 每个
server_name只写一个域名(支持通配符如*.old-a.com,但需谨慎测试) - 全部指向同一个新域名,保持路径一致,搜索引擎能快速识别这是“整体迁移”而非内容消失
- 上线前用 curl 测试响应头:
curl -I http://old-a.com/test,确认返回 301 + 正确 Location
避免踩坑的关键细节
无损迁移成败常取决于几个易忽略点:
- 不要在主站 server 块里用
if ($host = ...)做跳转——Nginx 官方明确不推荐,性能差且易出错 - 新域名的 SSL 证书必须已部署并生效,否则 HTTPS 跳转会失败,用户看到安全警告
- 检查旧域名 DNS 是否仍解析到当前服务器 IP;若已停用,跳转自然失效,需同步更新 DNS 或联系域名注册商做 URL 转发
- 迁移后持续监控 404 日志,确认没有漏掉子域名或特殊路径(如
/api/v1),必要时补 location 级 rewrite

















