break 标记使重写后的 uri 停止后续 rewrite 匹配且不重新查找 location,继续在当前 location 内执行 proxy_pass 等后续指令;last 则触发新 location 匹配。

在 Nginx 的 rewrite 指令中使用 break 标记,可以让重写后的 URI 停止后续的 rewrite 规则匹配,并**不发起新的 location 匹配**,而是直接以当前 location 块为上下文,继续执行该 location 内剩余的配置(如 proxy_pass、root、try_files 等)。
break 的作用机制
break 不是“跳出 location”,而是终止当前 location 中所有后续的 rewrite 指令执行,并保留重写后的新 URI(即内部 URI 变更),但不会触发新一轮的 location 查找 —— 仍留在原 location 块中处理请求。
- 与
last不同:last会用新 URI 重新进行 location 匹配,可能跳转到另一个 location;break则“就地消化” - 与
redirect/permanent不同:它们是 HTTP 外部跳转(302/301),而break是纯内部重写,客户端无感知 -
break只影响当前 location 内的 rewrite 阶段,不影响其他阶段(如 proxy_pass 的路径拼接逻辑)
典型使用场景:内部路径改写后代理到后端
例如,想把 /api/v1/users 改写为 /users,再代理到 http://backend,且不希望重写后又匹配其他 location:
location /api/v1/ {
rewrite ^/api/v1/(.*)$ /$1 break;
proxy_pass http://backend;
}
此时请求 /api/v1/users?name=alice:
- URI 被内部重写为
/users?name=alice - 不再检查其他
rewrite规则(当前 location 内后续 rewrite 被跳过) - 仍处于
location /api/v1/块中,执行proxy_pass http://backend - 最终发往后端的路径是
http://backend/users?name=alice(注意:proxy_pass末尾无/时,会拼接完整重写后的 URI)
注意事项和常见陷阱
-
break必须写在rewrite指令末尾,如:rewrite ... break;,不能单独成行 - 如果
location中有多个rewrite,只有第一个带break的生效,后续 rewrite 不再执行 - 搭配
proxy_pass使用时,确保proxy_pass的 URL 结构符合预期:若写成proxy_pass http://backend/;(结尾有/),则重写后的 URI 前缀/会被替换,实际发送的是http://backend/users?...;若写成proxy_pass http://backend;(无尾部/),则会追加整个重写后 URI,变成http://backend/users?...—— 效果相同,但逻辑不同 -
break对try_files无直接影响,但如果 rewrite 在 try_files 前,且用了 break,则 try_files 使用的是重写后的新 URI
对比 last:何时选 break
当你要“改个路径名,然后就在本 location 里继续处理”,就用 break;当你“改完路径后,希望按新路径重新走一遍 location 匹配流程”,才用 last。
比如有另一个 location location /users { ... },你用 last 就会跳过去,用 break 就不会 —— 这正是控制处理边界的关键。











