Nginx中location块内用rewrite实现302跳转,必须显式添加redirect标志,如rewrite ^/old/(.*)$ https://example.com/new/$1 redirect;该指令匹配后立即返回302响应,终止后续处理。
在 Nginx 的 location 块中使用 rewrite 实现临时跳转(HTTP 302),关键在于正确书写 rewrite 指令并添加 redirect 标志。
rewrite 指令用于匹配并重写请求 URI,其基本格式为:
rewrite <正则表达式> <替换目标> [flag];
要实现临时跳转(302),必须在 flag 中显式指定 redirect。如果不加 flag,默认是内部重写(不发跳转响应);若写 permanent 则是 301 永久跳转。
例如:
location /old/ {
rewrite ^/old/(.*)$ https://example.com/new/$1 redirect;
}
访问 /old/page.html 会返回 302,并跳转到 https://example.com/new/page.html。
Nginx 处理请求时,先匹配 location,再执行其中的 rewrite。这意味着:
rewrite 只在该 location 生效,不影响其他块rewrite 后的 URI 又匹配到另一个 location,且没加 last 或 break,可能触发新一轮匹配(但加了 redirect 就不会继续——直接返回 302)redirect 会立即终止当前处理流程,向客户端发送跳转响应,不再执行后续指令(如 proxy_pass、try_files 等)同一规则下不同 flag 的效果差异明显:
rewrite ^/a/(.*)$ /b/$1 redirect; → 返回 302,浏览器地址栏变化rewrite ^/a/(.*)$ /b/$1 permanent; → 返回 301,缓存性强,慎用于测试环境rewrite ^/a/(.*)$ /b/$1; 或 rewrite ^/a/(.*)$ /b/$1 last; → 不跳转,仅内部 URI 重写,后续仍走当前或新 location 处理(.*))可在替换目标中用 $1、$2 引用,注意不要遗漏斜杠或协议http:// 或 https://)时,Nginx 自动设为 302;但显式写 redirect 更清晰、可维护error_log /path/to/log notice; 配合 rewrite_log on; 查看重写过程(仅限 debug 编译版)