nginx rewrite标志位决定重写后行为:last触发内部重定向并重新匹配location,break终止当前location内rewrite且不重新匹配,redirect返回302跳转,permanent返回301永久跳转;慎用if+rewrite,避免循环和缓存陷阱。

Nginx 的 rewrite 规则中,标志位(flag)决定重写后的行为走向,比如是否终止匹配、是否发起新请求、是否忽略大小写等。用错标志位,常导致跳转失败、无限循环或规则不生效。
常用标志位及作用
标志位写在 rewrite 指令末尾,多个用空格分隔。核心标志有:
- last:内部重定向,停止当前 location 中的后续 rewrite,并用新 URI 重新匹配 location;适合路径改写后仍需走本 server 块内其他配置
- break:停止当前 location 内所有 rewrite,不再匹配新 location;URI 不变,只修改请求路径局部,常用于静态资源路径修正
- redirect:返回 302 临时跳转(HTTP 302),浏览器地址栏会变化;适用于简单外部跳转
- permanent:返回 301 永久跳转,SEO 友好;注意缓存影响,调试时慎用
-
if 不是 rewrite 标志位,但常和
if块混用——需注意if在 location 外不可用 rewrite,且if+ rewrite 易引发意外行为,官方不推荐
last 和 break 的关键区别
两者都停止当前 rewrite 链,但处理逻辑完全不同:
- 用 last 时,Nginx 会拿重写后的 URI 再次查找匹配的 location,可能进入另一个 block,适合“/old → /new”这类需要走不同配置的场景
- 用 break 时,Nginx 就地处理,不重新匹配 location,适合“把 /api/v1/xxx 改成 /api/v2/xxx 后继续走当前 location 的 proxy_pass”
- 错误示例:
rewrite ^/old(.*) /new$1 break;若 /new 对应另一个 location,用 break 就无法触发那个 location 的配置
redirect 与 permanent 的实际选择
二者都触发浏览器跳转,区别仅在状态码和缓存行为:
- 开发调试阶段优先用 redirect(302),避免浏览器或 CDN 缓存 301 导致反复刷新也不生效
- 上线确认无误后,再换 permanent(301),告诉搜索引擎“资源已永久搬家”
- 注意:301 一旦被缓存,用户本地可能长期跳转,清缓存或换设备才能验证新规则
常见陷阱与建议
标志位看似简单,但容易踩坑:
- 不要在
if块里依赖 rewrite + last —— Nginx 1.19+ 已明确警告该组合行为不可靠 - 避免 rewrite 循环:比如
rewrite ^/(.*)$ /$1/ last;没加条件判断,可能反复加斜杠直到超限报 500 - location 中启用 rewrite,需确保
rewrite_log on;(配合error_log ... notice;)方便排查 - 正则捕获变量(如 $1)在 redirect/permament 中可用,但在 break/last 后的 location 内不可直接引用,要靠 rewrite 传递或用 map 提前定义











