rewrite 指令配合 redirect 标志可实现 http 302 临时重定向,语法为 rewrite redirect,匹配后返回 302 状态码及 location 头;redirect 在 rewrite 执行阶段触发立即响应,不执行后续规则。

在 Nginx 中,用 rewrite 指令配合 redirect 标志,可以轻松实现 HTTP 302 临时重定向。
理解 rewrite + redirect 的基本语法
rewrite 指令本身不直接返回响应,需配合标志(flag)控制行为。其中 redirect 是专门用于发起 302 重定向的标志,它会强制使用 HTTP 302 状态码,并将重写后的 URL 作为 Location 响应头返回给客户端。
基本写法如下:
-
rewrite ^/old-path$ /new-path redirect;→ 匹配/old-path,302 跳转到/new-path -
rewrite ^/blog/(.*)$ https://example.com/articles/$1 redirect;→ 外部跳转,协议+域名必须写全
注意 rewrite 的执行阶段和 location 匹配顺序
rewrite 在 Nginx 请求处理流程中属于“重写阶段”,发生在 location 匹配之后、内部跳转之前。这意味着:
- 如果写在
server块顶层,它会对所有未被更具体location拦截的请求生效 - 如果写在某个
location块内,只对该 location 下匹配的路径起作用 - 多个
rewrite会按顺序执行,但一旦某条带redirect,立即返回响应,后续规则不再执行
常见用法示例
✅ 实现首页临时跳转:
location = / {
rewrite ^/ https://example.com/home redirect;
}
✅ 移除 URL 中的 .php 后缀并 302 跳转(避免直接暴露真实路径):
location ~ \.php$ {
rewrite ^(/.*\.php)$ $1? redirect;
}
✅ 将带 www 的域名统一跳转到无 www 版本(临时):
server {
server_name www.example.com;
return 302 https://example.com$request_uri;
}
⚠️ 注意:这里推荐用 return 302 更简洁明确;rewrite ... redirect 也可实现,但 return 性能更高、意图更清晰。
redirect 和 permanent 的区别
redirect → 302 临时重定向(浏览器不会缓存跳转,适合测试或短期调整)permanent → 301 永久重定向(浏览器可能长期缓存,SEO 权重会转移)
误用 permanent 后想改回临时跳转,需清理客户端缓存或加版本参数(如 ?v=2),否则可能不生效。











