旧域名整体迁移至新域名时,nginx 应使用 return 301 精准跳转每个旧 url 到语义等价的新 url,通过独立 server 块配置 http/https 跳转并保留 $request_uri,ssl 证书需覆盖旧域名,跳转规则应单独抽离文件管理,并经 nginx -t 和 curl 验证后 reload 生效。

旧域名整体迁移到新域名时,Nginx 的 301 重定向核心原则是:每个旧 URL 必须精准跳转到语义等价的新 URL,而不是全部跳首页;用 return 301 实现,避免 rewrite 带来的额外开销和潜在陷阱。
直接用 return 301 做全量跳转
这是最简洁、高效、安全的做法。return 指令不触发正则匹配和内部重写,性能高,逻辑清晰。
- 在独立的
server块中监听旧域名(HTTP 和 HTTPS 分开配置) -
server_name列出所有需跳转的旧域名(如old.com www.old.com) -
return 301后拼接新地址,务必保留$request_uri(含路径和查询参数)
示例(HTTP 跳转):
server {
listen 80;
server_name old.com www.old.com;
return 301 https://new.com$request_uri;
}
示例(HTTPS 跳转):
server {
listen 443 ssl;
server_name old.com;
ssl_certificate /etc/ssl/certs/old.com.crt;
ssl_certificate_key /etc/ssl/private/old.com.key;
return 301 https://new.com$request_uri;
}
⚠️ 注意:HTTPS server 块必须配好旧域名的 SSL 证书。若复用新站证书,确保该证书已包含
old.com(多域名或通配符类型)。
把跳转规则单独抽成文件管理
避免污染主配置,便于测试、回滚和多人协作。
- 新建
/etc/nginx/conf.d/redirects-old-to-new.conf - 文件里只放
server { ... }块,不写http { }或其他指令 - 在主配置(如
/etc/nginx/nginx.conf的http块末尾)或站点配置中加入:include /etc/nginx/conf.d/redirects-old-to-new.conf;
支持按域名分文件(如 redirects-a.com.conf、redirects-b.com.conf),也支持通配加载(include /etc/nginx/conf.d/redirects-*.conf;)。
多旧域名统一跳一个新域名
多个旧域名(包括带 www 和不带 www 的变体)可合并到同一个 server 块:
server {
listen 80;
server_name old1.com www.old1.com old2.com www.old2.com;
return 301 https://new.com$request_uri;
}
Nginx 会自动匹配任一域名命中即执行跳转,无需重复写多个 server 块。
验证和上线前检查
配置不是写完就生效,关键步骤不能跳过:
- 运行
nginx -t确认语法无误 - 执行
nginx -s reload重载配置(不要用 restart) - 用
curl -I http://old.com/some/path?x=1检查响应头:- 状态码是否为
301 Moved Permanently -
Location头是否为https://new.com/some/path?x=1(路径和参数完整)
- 状态码是否为
- 浏览器测试时建议用隐身窗口,或临时改
301为302避免缓存干扰
不复杂但容易忽略











