命名 location(@name)是nginx内部专用的子程序,不响应外部请求,仅由error_page、try_files或rewrite...last等指令触发;必须显式调用且建议加internal;防止误访。

命名 location(@name)不是用来响应外部请求的,而是专供 Nginx 内部跳转调用的“子程序”。它不会出现在 URL 地址栏里,客户端也访问不到,只在配置内部被 error_page、try_files 或 rewrite ... last 等指令触发使用。
命名 location 的基本写法
语法很简单,用 @ 开头加一个自定义名称:
location @not_found { ... }location @proxy_backend { ... }location @static_fallback { ... }
大括号内可以写任意合法的 Nginx 指令,比如 return、proxy_pass、internal(建议显式加上,强调仅限内部使用)。
典型使用场景
它最常配合以下三个指令工作:
-
error_page:把错误状态码重定向到命名 location
例如:error_page 404 @not_found;,再定义location @not_found { return 404 "Custom 404 page"; } -
try_files:按顺序尝试文件/路径,最后 fallback 到命名 location
例如:try_files $uri $uri/ @php_handler;,当静态文件找不到时,交给@php_handler处理 PHP 请求 -
rewrite ... last:重写后用last跳转到命名 location(注意不能用redirect)
例如:rewrite ^/old/(.*)$ /new/$1 last;后接location @new_route { proxy_pass http://backend; }
关键注意事项
- 命名 location 不参与常规 URI 匹配流程,Nginx 不会主动把它和用户请求的 URL 做对比
- 必须通过内部指令显式调用,否则永远不会执行
- 推荐在块内加上
internal;指令,防止被外部直接访问(即使没暴露,也是良好习惯) - 名字不能和普通 location 冲突,也不能含特殊字符或空格,用下划线或小写字母组合即可
一个完整例子
处理静态资源 + PHP 回退:
location / {
try_files $uri $uri/ @php;
}
location @php {
internal;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
用户请求 /index.php 会命中 $uri;请求 /about.html 存在就直接返回;请求 /api/user 找不到文件,就跳进 @php 块交给 PHP 处理。











