推荐用return 301实现旧域名到新域名的永久重定向,简洁高效、不触发正则开销;若必须用rewrite,需加permanent标志并置于server块顶层,用^(.*)$捕获全路径,配合$1保留参数,配置后须nginx -t验证并curl测试。

用 rewrite 实现旧域名到新域名的永久重定向,不是最推荐的做法——直接用 return 301 更简洁、高效、安全。但如果你确实需要或正在维护含 rewrite 的旧配置,下面讲清楚怎么写、为什么这么写、以及容易踩的坑。
✅ 推荐方案:用 return 301(首选)
这是 Nginx 官方推荐、性能最优的方式,不经过正则匹配,无循环风险,语义清晰:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
-
监听 80 端口,强制跳转 HTTPS 新域名:
server {<br> listen 80;<br> server_name old.com www.old.com;<br> return 301 https://new.com$request_uri;<br>} -
HTTP → HTTP 跳转(如仅换域名,暂不启 HTTPS):
return 301 http://new.com$request_uri; -
$request_uri 自动保留原始路径和查询参数,比如
http://old.com/a/b?x=1→https://new.com/a/b?x=1
⚠️ 如果非要用 rewrite(兼容旧配置或特殊逻辑)
语法为:rewrite ^(.*)$ https://new.com$1 permanent;,但要注意以下关键点:
-
必须加
permanent标志,否则默认是 302 临时跳转,对 SEO 无效; - 正则
^(.*)$捕获全部 URI,$1引用它,确保路径+参数不丢; -
不能放在
location /块里盲目套用,否则可能触发重复匹配(Nginx 最多重试 10 次,然后报 500); -
建议放在
server块顶层,或明确限定作用域,例如:server {<br> listen 80;<br> server_name old.com;<br> rewrite ^(.*)$ https://new.com$1 permanent;<br>}
? 配置后必须做的三件事
-
运行
nginx -t检查语法,避免 reload 失败; -
执行
nginx -s reload生效(不要用 restart); -
用 curl 验证状态码和跳转目标:
curl -I http://old.com/test?abc=1→ 应返回HTTP/1.1 301 Moved Permanently和Location: https://new.com/test?abc=1
? 补充:HTTPS 旧域名也要跳转
如果旧域名已配 SSL,还需单独加一个 HTTPS server 块,避免用户手动输 https://old.com 卡在旧站:
server {<br> listen 443 ssl;<br> server_name old.com;<br> ssl_certificate ...;<br> ssl_certificate_key ...;<br> return 301 https://new.com$request_uri;<br>}- 注意:这里
return后仍用https://new.com,不是$scheme——因为旧域名的 HTTPS 不应继续服务。










