nginx rewrite的flag决定重写后行为:last重新匹配location,break在当前块继续处理,redirect返回302,permanent返回301;flag不可叠加,if中慎用rewrite。

Nginx 的 rewrite 指令通过 flag 控制重写后的行为走向,关键在于理解每个 flag 如何影响后续的请求处理阶段——是继续匹配 location、跳出当前 block,还是直接发起内部跳转或外部重定向。
last:终止当前 location 内 rewrite,重新匹配 location
匹配成功后,用新 URI 重新进入 server → location 匹配流程,但仍在同一个请求周期内(不发 HTTP 跳转)。适合需要根据重写后的路径走不同 location 处理逻辑的场景。
- 仅对当前
location块内的 rewrite 生效 - 后续 rewrite 指令不再执行(即使在同一块中)
- 新 URI 会再次参与 location 查找,可能命中其他 location 块
- 示例:
rewrite ^/old/(.*)$ /new/$1 last;→ 请求/old/a.html变成/new/a.html,然后重新匹配 location ~ ^/new/
break:终止当前 block 内所有 rewrite,不重新匹配 location
立即停止当前 server 或 location 块中剩余的 rewrite,并用当前 URI 继续执行该 block 内后续指令(如 proxy_pass、root 等),不会重新查找 location。
- 常用于“改路径但不换处理逻辑”的情况,比如静态资源路径映射
- 与
last最大区别:URI 改了,但依然留在原 location 中处理 - 示例:
location /app/ { rewrite ^/app/(.*)$ /static/$1 break; alias /var/www/; }→/app/logo.png改为/static/logo.png,仍由这个 location 的 alias 指令服务
redirect 与 permanent:触发 HTTP 外部跳转
两者都结束 rewrite 流程并返回 3xx 响应,区别只在状态码:
-
redirect→ 返回 302(临时重定向),浏览器地址栏会变,不缓存跳转 -
permanent→ 返回 301(永久重定向),浏览器可能缓存,SEO 更友好 - 二者都会中断当前请求处理流程,不执行后续 rewrite 或 proxy_pass 等指令
- 必须配合完整 URL 或以
/开头的 URI 使用(否则 Nginx 报错) - 示例:
rewrite ^/v1/(.*)$ https://api.example.com/v2/$1 permanent;
常用组合与注意事项
flag 不能叠加使用(如不能写 last break),且部分 flag 有隐含行为:
- 不写 flag 默认等价于
last(仅限location块内;在server级则等价于break) -
last和break都是内部重写,不暴露给客户端;redirect/permanent是外部跳转,客户端可见 - 在
if块中使用 rewrite 要格外小心——Nginx 官方不推荐在 if 中做 rewrite,易引发非预期行为(如重复执行、匹配失效) - rewrite 执行顺序:按配置文件中出现顺序,从上到下;一旦某条匹配并带
last/break,后续 rewrite 就跳过











