nginx 301重定向核心是用return 301指令,在独立listen 80的server块中配置,配合$request_uri保留路径参数,避免rewrite和if;域名跳转需明确server_name,https强制跳转须分离http与https server块,目标地址建议写死以确保安全可靠。

Nginx 里设 301 重定向,核心就一条:用 return 301,别轻易用 rewrite,尤其别在 location 里乱套正则。
直接写 return 最稳、最快、最 SEO 友好
它不走正则匹配,不进 location 流程,不触发 rewrite 循环,语法检查通过后 reload 就生效,搜索引擎也认得清清楚楚——这是永久跳转,权重照常传递。
域名级跳转(比如 old.com → new.com)
- 确保 `listen 80;` 和 `server_name old.com www.old.com;` 都有
- 用 `$request_uri` 保留原始路径和参数,比如 `/blog?id=123` 跳过去还是 `/blog?id=123`
- 协议部分别依赖 `$scheme` 或 `$host` —— 容易出空值或跳错,直接写死目标地址更安全
server {
listen 80;
server_name old.com www.old.com;
return 301 https://new.com$request_uri;
}
子目录跳转到子域名(比如 /bbs → bbs.shturl.cc)
同样用独立 server 块或精准 location,避免误伤其他路径:- 裸路径 `/bbs` 和带后缀 `/bbs/xxx` 分开处理,或者用一条规则覆盖
- 推荐用 `location = /bbs { return 301 https://bbs.shturl.cc/; }` 处理精准匹配
- 再加一个 `location ^~ /bbs/ { return 301 https://bbs.shturl.cc$request_uri; }` 处理所有子路径
- 注意 `^~` 表示前缀匹配优先于正则,比 `if + rewrite` 更可靠
HTTP 全站强制跳 HTTPS
不是在 SSL 的 server 块里加逻辑,而是在纯 80 的 server 块里做跳转:- 只监听 80 端口,不要混进 443 ssl 配置里
- 目标域名写死,比如 `return 301 https://www.example.com$request_uri;`
- 如果用了 CDN,且真实协议头是 `X-Forwarded-Proto`,才考虑加 `if ($http_x_forwarded_proto != 'https')` 判断,否则不用
验证和避坑要点
- 改完先 `nginx -t` 检查语法,再 `nginx -s reload` 生效
- 用 `curl -I http://old.com/some-path` 看响应头:必须含 `HTTP/1.1 301 Moved Permanently` 和正确的 `Location:`
- 浏览器测试前清缓存,301 一旦缓存很难清除,开发阶段可临时改 `return 302` 验证逻辑
- 别在 `error_page 404` 后直接写 `return` —— 必须用命名 location 中转,否则不生效或循环
- 宝塔用户务必改站点专属配置文件(`/www/server/panel/vhost/nginx/xxx.conf`),别动主 nginx.conf,会被覆盖
不复杂但容易忽略。











