nginx 的 location 不支持语法嵌套,但可通过最长前缀匹配(如 ^~ /api/v2/)、精确匹配(= /health)、正则匹配(~ ^/api/v\d+/users/\d+$)、命名 location(@auth_check)和 map 指令实现逻辑嵌套效果。

Nginx 的 location 指令本身不支持语法嵌套,你不能在一个 location 块内部再写另一个 location。所谓“嵌套匹配”,实际是通过多个并列的 location 规则,利用其内置的优先级机制,实现逻辑上层层细化的路径分发效果。
用前缀匹配模拟路径层级
这是最常用、性能最好、也最贴近“嵌套感”的方式。Nginx 对无修饰符或 ^~ 的 location 采用最长前缀匹配,所以只要把更具体的路径写在前面,就能自然覆盖宽泛路径:
-
location ^~ /api/v2/→ 匹配/api/v2/users、/api/v2/orders/123 -
location ^~ /api/v1/→ 匹配/api/v1/login,但不会被上一条规则“吃掉” -
location ^~ /api/→ 作为兜底,匹配所有其他/api/xxx请求(可返回 404 或转发默认后端)
注意:^~ 不仅表示前缀匹配,还会阻止后续正则检查,适合静态资源或 API 版本这类确定性路径。
用精确匹配和正则补充边界场景
当需要处理特定路径或动态结构时,精确匹配和正则能补上前缀匹配的不足:
-
location = /health→ 只响应/health,不响应/health/或/health?check=1,适合探针接口 -
location ~ ^/api/v\d+/users/\d+$→ 精准捕获带版本号和用户 ID 的路径,配合$1、$2在proxy_pass中重用 -
location ~* \.(js|css|woff2?)$→ 统一处理前端资源,大小写不敏感,避免漏掉.JS类请求
正则按配置顺序扫描,命中即停,所以高优先级的正则要写在靠前位置。
用命名 location 实现条件跳转
虽然不能嵌套,但可通过 try_files 或 error_page 跳转到以 @ 开头的命名 location,把共用逻辑抽出来:
location /admin/ { try_files $uri @auth_check; }location @auth_check { auth_request /_auth; proxy_pass http://backend-admin; }
这样就把权限校验从每个业务路径中解耦出来,既保持配置扁平,又实现逻辑复用。
用 map 指令统一管理复杂分流策略
当路径规则超过 5–10 条,或需结合 Header、参数、IP 等多维条件时,map 比堆砌 location 更清晰、更易维护:
- 在
http块中定义:map $request_uri $backend { default "default_backend"; ~ ^/api/v2/ "v2_backend"; ~ ^/internal/ "internal_backend"; } - 在
location /内直接使用:proxy_pass http://$backend;
map 支持默认值、嵌套判断、变量复用,且一次计算多次使用,性能优于重复正则匹配。











