Nginx location正则匹配支持用()捕获子表达式,通过$1、$2等变量引用;以~或~*开头,按配置顺序匹配,一旦成功即停止;捕获变量可用于proxy_pass、rewrite等指令实现动态路由,但仅在当前location内有效。

Nginx 的 location 块支持正则表达式匹配,其中用圆括号 () 定义的子表达式可以捕获匹配内容,并在后续配置中通过 $1、$2 等变量引用。
location 正则匹配的基本语法
以 ~(区分大小写)或 ~*(不区分大小写)开头的 location 表示启用正则匹配。只要 URI 与正则模式匹配,就进入该块处理。
-
location ~ ^/api/(v\d+)/(.+)$ { ... }—— 匹配类似/api/v1/users的路径 - 圆括号内的内容会被依次捕获为
$1、$2……最多支持 $9 - 注意:正则匹配按配置文件中出现顺序执行,一旦匹配成功即停止查找(除非使用
^~或=等前缀匹配优先级更高)
捕获变量在 proxy_pass 和 rewrite 中的使用
捕获的分组可在 proxy_pass、rewrite、return、set 等指令中直接引用,实现动态路由或重写。
-
proxy_pass http://backend/$1/$2;—— 将/api/v2/posts转发为http://backend/v2/posts -
rewrite ^/old/(.*)$ /new/$1 permanent;—— 301 重定向所有/old/xxx到/new/xxx - 若
proxy_pass后带 URI(如proxy_pass http://upstream/abc/;),则$1等变量仍可用,但路径拼接逻辑需注意:Nginx 会丢弃原始请求 URI 的匹配部分,再拼接proxy_pass后的路径和变量
常见陷阱与注意事项
正则捕获看似简单,但实际配置中容易出错,尤其涉及变量作用域和匹配优先级。
-
$1只在当前location块内有效;不能跨 location 引用其他块的捕获结果 - 如果多个正则 location 都匹配,只执行第一个(按配置顺序),后面的捕获不会生效
- 避免在
location ~ \.php$这类通用匹配中嵌套复杂捕获,可能干扰 FastCGI 路由;建议将捕获逻辑放在更具体的路径上 - 使用
log_format+$1可用于调试,例如:log_format debug '$uri → $1 $2';
实际例子:API 版本路由转发
把不同版本的 API 请求转发到对应后端服务:
location ~ ^/api/(v\d+)/(.*?)/?$ {
set $version $1;
set $path $2;
proxy_set_header X-API-Version $version;
proxy_pass http://api-$version/$path;
}
访问 /api/v2/products?id=1 时,$1 是 v2,$2 是 products,查询参数自动保留,转发目标为 http://api-v2/products?id=1。


















