break终止当前location内rewrite执行,不重启匹配,新URI在当前location内继续处理;last则丢弃当前匹配,用新URI从server块重新开始location匹配。

nginx 中 rewrite 的 break 和 last 都用于终止当前 rewrite 流程,但后续行为完全不同——关键区别在于:是否用新 URI 重新进入 location 匹配阶段。
break:就地处理,不重启匹配
遇到 break 后,Nginx 停止执行当前块内后续所有 rewrite 指令,并直接使用当前已重写后的 URI,在**当前 location 内继续走完剩余流程**(比如 alias、root、proxy_pass 等),不再跳出去重新匹配其他 location。
- 适合用在非根 location 中,尤其是配合
alias或需要精确控制路径映射的场景 - 若当前 location 配了
proxy_pass http://backend,重写后路径会作为相对路径透传给后端 - 常见误用:在
alias下用了break,结果 404 —— 因为 alias 要求路径必须严格对齐,而 break 不触发重匹配,容易导致 root/alias 解析错位
last:重启匹配,像发起一次新请求
last 会让 Nginx **丢弃当前匹配结果,拿着重写后的新 URI,从头开始执行 server 块内的 location 匹配流程**,就像用户真的发起了一个新请求一样。
- 适合用在 server 块或 if 块中,也常用于根 location 下做路径标准化后再交由具体 location 处理
- 若重写后 URI 匹配到另一个 location(如
location /api/),就会执行那个 location 的配置 - 必须搭配
alias使用:因为 alias 的路径替换逻辑依赖于 location 的完整匹配上下文,只有 last 才能触发重匹配来激活它
一个典型对比示例
假设配置如下:
location /old/ {
rewrite ^/old/(.*)$ /new/$1 last;
}
location /new/ {
return 200 "served by /new/";
}
访问 /old/test → 重写为 /new/test → 触发 last → 重新匹配 → 进入 /new/ location → 返回 "served by /new/"
如果把 last 换成 break:
- 重写后 URI 变为
/new/test,但仍在/old/location 内执行 - 由于该 location 没有 proxy_pass 或 root 设置,最终可能返回 404 或 fallback 到默认 root
怎么选?看你的目标
想让重写后的路径被其他 location 拦截处理 → 用 last
想在当前 location 内直接用新路径做文件服务或代理 → 用 break
用了 alias → 必须用 last
用了 proxy_pass 且路径需透传 → 多数情况用 break


















