Nginx 不支持 location 块内嵌套,需通过多级独立 location 块依优先级(精确= > 最长前缀^~ > 正则~)模拟二级路由;推荐按 specificity 从高到低排列,如 /admin/ 下用 =、^~、/ 分层匹配,并可用正则捕获动态路径。

Nginx 不支持在 location 块内部“嵌套”另一个 location 块(语法上直接写会报错:"location" directive is not allowed here)。所谓“二级路由”,实际是通过多个独立、层级分明的 location 块,利用匹配优先级和路径前缀关系来实现逻辑上的嵌套效果。
用前缀匹配 + 优先级模拟“嵌套”
Nginx 的 location 匹配是基于 URI 路径的,且遵循明确的优先级规则:精确匹配(=) > 长度最长的前缀匹配(^~ 或普通字符串) > 正则匹配(~ / ~*)。你可以为“一级路径”和“二级子路径”分别定义 location,依靠路径前缀自然形成层级关系。
-
一级路径:如
/api/ -
二级路径:如
/api/v1/users、/api/v2/posts—— 它们天然属于/api/前缀下 - 只要把更具体的路径写在前面(比如
/api/v1/users),它就会优先于宽泛的/api/被匹配到
推荐写法:按 specificity 从高到低排列
以下是一个典型示例,实现 /admin/ 下的细粒度控制:
location = /admin/ {
return 302 /admin/dashboard;
}
location ^~ /admin/api/ {
proxy_pass http://backend-api;
}
location ^~ /admin/static/ {
alias /var/www/admin-static/;
}
location /admin/ {
root /var/www/admin-frontend;
try_files $uri $uri/ /admin/index.html;
}
-
= /admin/精确匹配根入口,做跳转 -
^~ /admin/api/强制前缀匹配,不进入正则阶段,代理到 API 服务 -
^~ /admin/static/同样用^~避免被后续正则干扰,走本地文件 -
/admin/是兜底,处理所有其他以/admin/开头的请求(如页面资源)
需要“动态二级路由”?用正则 + capture
如果二级路径有规律(如版本号、ID),可用正则捕获并重写或传递:
location ~ ^/app/(?<version>v\d+)/(?<resource>\w+)/?$ {
set $upstream http://service-$version;
proxy_pass $upstream/$resource;
}
-
(?<version>v\d+)捕获类似v1、v2的版本段 -
(?<resource>\w+)捕获资源名,如users、orders - 配合
set和变量,可灵活路由到不同后端
注意:避免常见陷阱
-
不要写
location /api/ { location /api/v1/ { ... } }</strong> —— 语法非法</li> <li><strong><code>proxy_pass末尾斜杠影响路径重写:proxy_pass http://upstream;会透传完整 URI;proxy_pass http://upstream/;(带斜杠)会剥离匹配前缀 -
正则 location 性能略低,高频路径建议优先用
^~或字符串前缀匹配



















