最简洁高效的方式是用两个独立server块分别监听80和443端口,通过return 301实现全站域名跳转,并将配置抽离为单独文件用include引入,支持多旧域名合并配置与严格证书验证。

直接用 return 301 是最简洁、高效的方式,既避免 rewrite 的复杂匹配,又不依赖 location 块,适合全站域名级跳转。
只配两个 server 块,覆盖 HTTP 和 HTTPS
旧域名必须单独监听 80 和 443 端口,不能混在新站配置里。每个 server 块只做一件事:返回 301 并跳转到新地址。
-
监听 80 端口(HTTP)
server { listen 80; server_name old-site.com www.old-site.com; return 301 https://new-site.com$request_uri; } -
监听 443 端口(HTTPS)
server { listen 443 ssl; server_name old-site.com; ssl_certificate /etc/ssl/certs/old-site.crt; ssl_certificate_key /etc/ssl/private/old-site.key; return 301 https://new-site.com$request_uri; }
注意:HTTPS server 块里的证书必须能验证 old-site.com,不能复用新站证书除非它是通配符或含该域名的 SAN 证书。
把跳转规则单独抽成文件,用 include 引入
别把 redirect 写进主配置或站点配置里。新建一个独立文件,比如 /etc/nginx/conf.d/redirects-old-to-new.conf,内容就是上面两个 server 块。
然后在主配置的 http { } 块末尾,或站点配置的 server { } 块外部(同级位置),加一行:
include /etc/nginx/conf.d/redirects-old-to-new.conf;
这样改规则不用碰主配置,测试时可临时注释 include 行,出问题秒回滚。
多旧域名统一跳转,合并写在一个 server 块里
如果 old1.com、old2.com、www.old1.com 都要跳到同一个新域名,不用写多个 server 块:
server {
listen 80;
server_name old1.com old2.com www.old1.com;
return 301 https://new-site.com$request_uri;
}Nginx 自动匹配任意一个 server_name,命中即跳,逻辑清晰、维护方便。
验证和上线前必做三件事
- 运行
nginx -t检查语法是否正确 - 执行
nginx -s reload重载配置(不是 restart) - 用
curl -I http://old-site.com/some-path?x=1确认返回头含:HTTP/1.1 301 Moved PermanentlyLocation: https://new-site.com/some-path?x=1
浏览器测试时记得清缓存,301 一旦生效就会被长期记住;调试阶段可用 return 302 临时替代,验证无误再切回 301。


















