Nginx Rewrite 规则中 `redirect` 与 `permanent` 如何用

作者:袖梨 2026-08-16

301是永久重定向,资源已永久迁移,浏览器缓存跳转、搜索引擎传递权重;302是临时重定向,仅短期跳转,不缓存、不传权重,适用于维护、A/B测试、登录跳转等场景。

这两个 flag 都用于触发 HTTP 重定向,但语义和用途完全不同:`redirect` 发送 302 临时跳转,`permanent` 发送 301 永久跳转。选错会影响 SEO、浏览器缓存和客户端行为。

什么时候用 redirect(302)

适用于短期、可逆的跳转场景,浏览器不会长期缓存该跳转,搜索引擎也不会转移权重。

  1. 维护期间临时跳转到公告页
  2. A/B 测试时将部分用户导向新页面
  3. 灰度发布阶段,只对特定 IP 或 UA 做临时路由
  4. 登录后跳回原请求路径(如 /admin → 登录 → /admin),这类跳转本就是一次性的

什么时候用 permanent(301)

表示资源已永久迁移,浏览器会缓存该跳转(通常长期有效),搜索引擎会把旧 URL 的权重、排名迁移到新 URL。

  1. 域名更换(old.com → new.com)
  2. URL 结构重构(/blog/post?id=123 → /posts/123)
  3. HTTP 升级 HTTPS(所有 http 请求永久跳转到 https)
  4. 废弃旧路径,统一归并到新路径(如 /old-api → /v2/api)

写法与注意事项

两者都必须配合 rewrite 使用,且会立即终止当前 location 内后续指令(包括 return、set 等)。

  1. 语法格式:rewrite ^/old(.*)$ /new$1 permanent;rewrite ^/temp(.*)$ /beta$1 redirect;
  2. 不能和 last/break 混用 —— permanent 和 redirect 是互斥的终止型 flag
  3. 如果只是简单跳转(无正则替换),优先用 return 301return 302,更轻量、更安全
  4. 测试时注意清浏览器缓存:301 一旦被缓存,本地可能持续跳转,即使配置已改

和 return 跳转的区别

rewrite + permanent/redirect 是“先改写 URL,再发重定向响应”;而 return 是直接响应,不经过 rewrite 匹配逻辑。

  1. return 301 https://$host$request_uri; 更适合全站 HTTPS 强制跳转
  2. rewrite ^/(.*).html$ /$1 permanent; 适合去掉 .html 后缀的伪静态迁移
  3. return 不支持正则捕获,rewrite 支持重用分组(如 $1、$2),灵活性更高

相关文章

精彩推荐