命名 location 是以 @ 开头的内部跳转目标,仅供 nginx 内部指令(如 try_files、error_page、rewrite)调用,不响应外部请求,不参与 uri 匹配,且内部跳转时保持原始 uri 不变。

@ 符号定义的命名 location 是内部专用的跳转目标,不响应外部请求,只供 Nginx 内部指令(如 try_files、error_page、rewrite)触发跳转使用。
核心用途:实现内部重定向
命名 location 不是给用户直接访问的,它像一个“隐藏函数”,只能被 Nginx 自己调用。典型场景包括:
- 当静态文件不存在时,用
try_files $uri $uri/ @fallback跳转到前端路由入口(如 Vue/React 的/index.html) - 自定义错误页时,用
error_page 404 @notfound把 404 请求交给命名 location 处理 - 在 rewrite 中配合
last或break实现内部路径改写后继续匹配
@ 与普通 location 的关键区别
命名 location 有三个明显特征:
- 以
@开头,比如location @app,客户端无法通过 URL 直接访问/@app或类似路径 - 不参与常规的 URI 匹配流程,不会被
location /xxx这类规则竞争或覆盖 - 内部跳转时不改变原始请求 URI,只是切换处理逻辑,对浏览器完全透明
常见配置示例
一个典型的单页应用(SPA)配置:
location / {
try_files $uri $uri/ @router;
}
location @router {
rewrite ^(.*)$ /index.html last;
}
这里:
– 用户请求 /user/profile,Nginx 先查静态文件,找不到就跳进 @router
– @router 内部把路径重写为 /index.html,再重新进入 location 匹配流程
– 最终由 root 和 index 指令返回 index.html,前端路由接管后续渲染
注意事项
使用 @ 时需注意几点:
- 不能在命名 location 中使用
root、alias等影响路径解析的指令(除非明确需要),否则容易导致路径错乱 -
try_files后的@name必须真实存在,否则会报 500 错误 - 命名 location 里一般只放
rewrite、return、proxy_pass等控制流向的指令,不建议放日志或访问控制逻辑











