nginx location 块中不能直接捕获查询参数,但可用正则 location(如~、~*)捕获路径动态段,通过$1、$2等变量在rewrite、proxy_pass等指令中使用;查询参数需用$arg_xxx或$args获取。

在 Nginx 的 location 块中,**不能直接使用 capture(捕获组)来提取参数值**,因为 location 本身只做 URI 路径匹配,不解析查询字符串(即 ?key=value 部分)。但你可以通过正则表达式 location 捕获路径中的动态段,并结合 $1、$2 等变量在后续指令(如 rewrite、proxy_pass、set)中使用这些捕获值。
location 中用正则捕获路径参数
当 location 以 ~(区分大小写)、~*(不区分大小写)或 ^~ + 正则开头时,支持 PCRE 正则语法,可使用 () 定义捕获组:
-
location ~ ^/user/(\d+)/profile$ { ... }→ 捕获用户 ID,可通过$1引用 -
location ~* ^/api/v([0-9]+)/(.+)$ { ... }→ 捕获版本号和子路径,对应$1和$2
注意:只有带正则修饰符的 location(如 ~、~*)才支持捕获;前缀匹配(如 location /api/)和精确匹配(location = /)不支持。
捕获值可用于 rewrite 或 proxy_pass
捕获的变量($1、$2…)在同个 location 块内立即可用,常用于重写或透传:
-
rewrite ^/old/(.*)$ /new/$1 permanent;—— 外部重定向 -
proxy_pass http://backend/user/$1/profile;—— 若 location 是~ ^/u/(\d+)$,则$1会代入后端地址 -
fastcgi_param SCRIPT_FILENAME /var/www/app/$1.php;—— PHP 场景下指定脚本路径
查询参数(query string)需用 $arg_XXX 或 $args
URL 中 ?id=123&name=foo 这类参数不属于路径匹配范围,Nginx 不在 location 中捕获它们。应使用:
-
$arg_id→ 获取id=123的值(自动解码) -
$arg_name→ 获取name=foo的值 -
$args→ 获取完整未解码的查询字符串(如id=123&name=foo) - 若需在
rewrite中保留原始 query,加?结尾:rewrite ^/search$ /list?$args;
避免常见陷阱
捕获变量的作用域仅限当前匹配成功的 location 块,且在 rewrite 执行后可能被覆盖:
- 不要在
if块里依赖location的捕获变量 ——if有自己的作用域,$1可能为空 -
proxy_pass后带 URI(如/backend/)时,会替换掉原始路径,导致$1无法直接拼接;建议用rewrite提前处理,或用proxy_pass不带 URI(让路径透传) - 多个嵌套正则(如
rewrite内又用正则)会覆盖外层$1,建议用set $my_id $1;临时保存











