break 用于重写 URI 后立即终止当前 location 内 rewrite 指令执行,不重新匹配 location,直接进入后续处理(如 proxy_pass);last 则会用新 URI 重新匹配 location。

Nginx 中使用 rewrite 指令配合 break 标志,是为了在当前 location 块内完成 URI 重写后**立即终止后续的 rewrite 处理流程**,但不跳出当前 location,也不发起新的请求匹配(即不触发内部重定向)。这和 last 的行为有本质区别。
break 的作用机制
break 会让 Nginx 停止执行当前 location 中剩余的 rewrite 指令,并直接进入后续的请求处理阶段(如 try_files、proxy_pass 等),不会重新匹配 location。它只影响 rewrite 阶段,不影响其他模块逻辑。
常见误用是把它当成“跳转结束”或“返回响应”,其实它不发响应、不跳转、不重走路由 —— 它只是“别再改 URI 了,就用现在这个继续往下走”。
break 和 last 的关键区别
-
break:改完 URI 后,留在当前 location,继续执行该 location 下的其他指令(比如
proxy_pass或root) - last:改完 URI 后,Nginx 会用新 URI 重新匹配 location,相当于一次内部重定向,可能进入另一个 location 块
典型使用场景与写法
例如,你想把 /api/v1/users 重写为 /v1/users,并由当前 location 的 proxy_pass 转发,且不希望重写后又去匹配别的 location:
location /api/ {
rewrite ^/api(/.*)$ $1 break;
proxy_pass http://backend;
}
这里:
- 请求 /api/v1/users → 重写为 /v1/users
- 因为用了 break,Nginx 不会重新找匹配 /v1/ 的 location
- 直接用当前 location 的 proxy_pass 把 /v1/users 转发给后端
注意事项
-
break只对当前 location 内的rewrite生效;跨 location 不传递 - 如果 location 中有多个
rewrite,遇到第一个带break的就会停止执行后面的 rewrite - 不要在
if块中滥用rewrite ... break,容易引发不可预期行为(Nginx 官方不推荐在 if 中使用 rewrite) - 若需彻底终止并返回响应,请用
return或rewrite ... redirect,而非break


















