last标志表示重写URI后停止当前location内后续rewrite指令,并用新URI重新匹配location,实现内部重定向;它不返回HTTP状态码,URL地址栏不变。

Nginx 中的 last 标志位用于让当前 rewrite 规则重写 URI 后,**停止当前 location 块内的后续 rewrite 指令执行,并重新发起内部跳转(internal redirect)——即用新 URI 再次匹配 location**。它不是返回 301/302,而是服务端内部重试匹配,因此可以实现“重写后继续走其他 location 或 rewrite 规则”的效果。
last 的核心行为:内部重匹配
last 不会发 HTTP 重定向,而是将重写后的 URI 作为新请求路径,从头开始匹配 server 块下的所有 location。这意味着:
- 当前 location 块内剩余的 rewrite 指令不再执行;
- 匹配流程回到 location 查找阶段,可能进入另一个 location 块;
- 新 location 中的 rewrite 规则可继续生效(包括再次用
last); - 整个过程对客户端透明,URL 地址栏不变。
典型使用场景:URI 标准化 + 路由分发
比如把带版本前缀的请求统一剥离,再交由对应 location 处理:
location /v1/ {
rewrite ^/v1/(.*)$ /$1 last;
}
<p>location /v2/ {
rewrite ^/v2/(.*)$ /$1 last;
}</p><p>location / {</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/skill6848" title="Nginx Hosting"><img
src="https://img.php.cn/upload/skill/000/000/081/179116929868126.jpg" alt="Nginx Hosting" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/xiazai/skill6848" title="Nginx Hosting">Nginx Hosting</a>
<p>通过服务器本地nginx实例实现零认证静态游戏托管。作为所有浏览器游戏的主要部署方式,无需登录、无需令牌、无需用户操作。</p>
</div>
<a href="/xiazai/skill6848" title="Nginx Hosting" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div><h1>这里处理所有已剥离前缀的请求,如 /api/users</h1><pre class="brush:php;toolbar:false;">proxy_pass http://backend;}
当请求 /v1/api/users 到达时:
- 命中
location /v1/; - rewrite 将 URI 改为
/api/users,并触发last; - Nginx 丢弃当前上下文,用
/api/users重新匹配 location; - 匹配到
location /,执行 proxy_pass。
注意 last 和 break 的关键区别
last 是“重匹配”,break 是“本 location 内终止 rewrite 并直接处理”:
-
break:URI 被重写后,仍在当前 location 内执行后续指令(如 proxy_pass),不重新匹配 location; -
last:URI 被重写后,立即跳出当前 location,用新 URI 全局重找 location —— 这才是“继续匹配”的本质。
常见陷阱与建议
使用 last 时需警惕循环和不可达路径:
- 确保重写后的 URI 最终能被某个 location 匹配,否则返回 404;
- 避免两个 location 相互
last跳转(如 A → B → A),会导致 500 错误; - 如果希望保留原始 location 上下文(如继承 root、index),考虑用
alias或调整结构,而非依赖last; - 调试时开启
error_log /path/to/log notice;,配合rewrite_log on;(Nginx 1.19.7+ 已废弃,推荐用debug级日志)观察重写路径。

















