最稳妥推荐做法是用 return 301 实现全站跳转,配置轻量、无正则开销、不易出错且不冲突;需在监听80端口的server块中明确设置旧域名、写死https协议、保留$request_uri、加分号,并重载配置后用curl验证响应头。

全站改版时做链接重定向,核心目标是让老URL全部跳转到新URL,同时不损失SEO权重。Nginx里最稳妥、推荐的做法是用 return 301,而不是 rewrite —— 它更轻量、无正则开销、不易出错、也不会和其它规则冲突。
直接用 return 301 实现全站跳转
适用于旧域名整体迁移到新域名(比如 old.com → new.com),或 HTTP 全站强制跳 HTTPS。
- 在宝塔面板中,进【网站】→【设置】→【配置文件】,找到监听
80端口的server块(不是 443 那个) - 确保
server_name明确列出旧域名(如old.com www.old.com) - 插入一行:
return 301 https://new.com$request_uri;
注意:
- 协议写死为
https://更安全(避免$scheme在没配 HTTPS 时跳成 http) -
$request_uri必须保留,它带原始路径+查询参数,对 SEO 和用户体验关键 - 行尾加分号
;,漏掉会导致 Nginx 启动失败
- 协议写死为
修改后点【重载配置】,再用 curl -I http://old.com/some/path?x=1 检查响应头是否含 301 Moved Permanently 和正确 Location
子目录或路径级重定向(非全域名)
比如 /bbs/xxx → https://bbs.old.com/xxx,或 /old-page.html → /new-page/
- 用
rewrite更灵活,但只在必要时用 - 示例:把所有
/bbs/开头请求跳到子域名rewrite ^/bbs$ https://bbs.old.com/ permanent; rewrite ^/bbs/(.*)$ https://bbs.old.com/$1 permanent;
- 第一条匹配裸路径
/bbs - 第二条捕获
/bbs/xxx中的xxx,拼到新地址后保持路径一致 -
permanent表示 301,别漏写,否则默认是 302
- 第一条匹配裸路径
这类规则建议放在 server 块顶部(location 外),避免被 location 内部规则覆盖。
多旧域名统一跳一个新主域
比如 site-a.com、site-b.net、www.site-a.com 都要跳 https://main.com
- 合并写在一个
server块里:server { listen 80; server_name site-a.com www.site-a.com site-b.net; return 301 https://main.com$request_uri; } - 不要用
$host动态拼接,防止 IP 访问或异常 Host 头导致跳转地址非法(如https:///xxx)
避免常见翻车点
- 别直接改
/usr/local/nginx/conf/nginx.conf:宝塔会覆盖它,改站点专属 conf(路径类似/www/server/panel/vhost/nginx/xxx.com.conf) - HTTPS 跳转后出现“重定向循环”?检查是否同时开了宝塔「强制 HTTPS」开关 + 手动写了
return 301,二者重复触发 - Let’s Encrypt 续签失败?确保
.well-known/acme-challenge/路径没被重定向规则误伤(可加location ^~ /.well-known/ { }排除) - 浏览器缓存 301 很久,测试阶段可用
return 302临时验证,确认无误再切回 301
不复杂但容易忽略











