核心是用return 301指令在独立server块中配置,http与https跳转须分离,跳转规则应抽离为单独配置文件并通过include引入,务必使用$request_uri保留完整路径和查询参数,并用curl -i验证响应头。

在 nginx.conf 中配置旧链接重定向,核心是用 return 301 指令写在独立的 server 块里,不混入新站配置,确保跳转精准、路径参数完整、协议安全。
把跳转逻辑单独抽成配置文件(推荐)
避免污染主配置,也方便多站点复用和快速回滚:
- 新建文件,例如
/etc/nginx/conf.d/redirects-old-to-new.conf - 文件内容只包含一个或多个干净的
server { }块,不要写http { }或全局指令 - 在
nginx.conf的http块末尾加入:include /etc/nginx/conf.d/redirects-old-to-new.conf; - 支持通配加载:比如写
include /etc/nginx/conf.d/redirects-*.conf;,便于按域名分文件管理
HTTP 和 HTTPS 跳转必须分开写两个 server 块
旧域名若同时支持 HTTP 和 HTTPS,不能合并在一个块里:
- HTTP 跳转(监听 80 端口):
server {<br> listen 80;<br> server_name old.com www.old.com;<br> return 301 https://new.com$request_uri;<br>} - HTTPS 跳转(监听 443 端口):
server {<br> listen 443 ssl;<br> server_name old.com;<br> ssl_certificate /path/to/old.com.crt;<br> ssl_certificate_key /path/to/old.com.key;<br> return 301 https://new.com$request_uri;<br>} - 证书必须覆盖
old.com,通配符或 SAN 多域名证书更稳妥
保留原始路径和查询参数的关键写法
用户访问 /blog/post?id=123,跳过去必须还是 /blog/post?id=123:
- 务必用
$request_uri—— 它包含路径 + 完整查询字符串(?...部分) - 错误示范:
return 301 https://new.com/;(丢掉全部路径和参数) - 正确示范:
return 301 https://new.com$request_uri; - 不要用
$uri或$host替代,前者不含查询参数,后者有开放重定向风险
验证是否生效不能只靠浏览器
301 会被浏览器强缓存,临时调试容易误判:
- 终端执行:
curl -I http://old.com/some-page,确认返回头含:HTTP/1.1 301 Moved PermanentlyLocation: https://new.com/some-page - 对 HTTPS 地址同样测试:
curl -I https://old.com/test - 每次修改后先运行:
nginx -t检查语法,再systemctl reload nginx - 宝塔用户注意:改「网站 → 设置 → 配置文件」,别直接动
nginx.conf,否则重启后失效











