Nginx命名location(@开头)仅用于内部重定向,不可被客户端访问,须置于server或location块内,不支持正则、URI参数及路径匹配;通过error_page、try_files或rewrite last触发,常用于错误处理、SPA回退和路由分发。

Nginx 中的命名 location(以 @ 开头)专用于内部重定向,不能被客户端直接访问,常用于错误处理、内部跳转和逻辑复用。它不参与常规请求匹配,只通过 error_page、try_files 或 rewrite ... last 触发。
命名 location 的基本写法与限制
命名 location 必须以 @ 开头,后面跟合法标识符(如 @not_found),且只能出现在 server 或 location 块内。它不支持正则、前缀匹配等语法,也不接受 URI 参数;Nginx 会忽略其后路径部分,只执行块内指令。
- ✅ 正确:
location @fallback { return 200 "Fallback reached"; } - ❌ 错误:
location @/api { ... }(不能含斜杠开头) - ❌ 错误:
location @proxy { proxy_pass http://backend; }后面加/path(命名 location 不支持 URI 重写)
用 error_page 实现错误页面跳转
error_page 是最常用场景:将指定 HTTP 状态码映射到命名 location,实现自定义错误响应。注意它只触发内部重定向,不会改变响应状态码(除非在命名 location 中显式用 return 或 proxy_pass 改写)。
- 配置示例:
error_page 404 @not_found;<br>location @not_found {<br> return 404 "Custom 404 page";<br>} - 若需返回静态 HTML 文件,可用
root+try_files:location @not_found {<br> root /usr/share/nginx/html;<br> try_files /404.html =404;<br>} - 支持链式跳转:一个命名 location 可再调用另一个,但要避免循环(如
@a→@b→@a)
用 try_files 结合命名 location 实现内部路由回退
try_files 在找不到文件时,可把最后参数设为命名 location,常用于 SPA(如 Vue/React)的 history 模式或动态接口兜底。
- 前端单页应用示例:
location / {<br> root /var/www/app;<br> try_files $uri $uri/ @rewrites;<br>}<br>location @rewrites {<br> rewrite ^(.*)$ /index.html break;<br>} - 注意:
break表示停止 rewrite 处理,直接用当前 URI 查找文件;用last则会重新匹配 location,可能引发循环 - 也可在
@rewrites中直接proxy_pass到后端 API,实现“静态资源走本地,API 走代理”的混合路由
rewrite last 与命名 location 的配合
当 rewrite 使用 last 标志时,Nginx 会终止当前 location 的处理,并用新 URI 重新匹配 location 块——如果新 URI 匹配到命名 location,则进入该块。
- 典型用法:
location /old-api {<br> rewrite ^/old-api/(.*)$ /new-api/$1 last;<br>}<br>location /new-api {<br> proxy_pass http://api_backend;<br>} - 若希望重写后统一交由某个逻辑处理,可指向命名 location:
location /v1 {<br> rewrite ^/v1/(.*)$ /api/$1 last;<br>}<br>location @api_handler {<br> proxy_pass http://internal_api;<br>} - ⚠️ 注意:
rewrite ... last不会直接跳进@xxx,必须重写后的 URI 字面量匹配到该命名 location 才行(即 URI 必须是@api_handler这样的形式,但命名 location 不参与普通匹配,所以实际中更推荐用error_page或try_files显式调用)


















