nginx rewrite中变量引用仅支持捕获组($1–$9)、内置变量(如$args、$uri)及set定义的自定义变量;正则内不可用变量,字面量$需写为$$。

Nginx 的 rewrite 规则中,变量引用主要通过 捕获组(正则表达式括号匹配) 和 内置变量(如 $1, $2, $args 等) 实现,不能直接写 $var 这样的自定义变量(除非用 set 指令预先定义)。
以下是常用写法和关键细节:
捕获组变量:`$1`, `$2`, … `$9`
在 `rewrite` 的正则部分用 () 捕获内容,后续重写目标中用 、 引用对应匹配项:
rewrite ^/article/(\d+)/(.*)$ /post.php?id=$1&title=$2 last;
说明:
– (\d+) 匹配数字,值赋给 $1
– (.*) 匹配剩余路径,值赋给 $2
– 注意:最多支持 9 个捕获组,$0 表示整个匹配字符串(不常用)
常用内置变量可直接引用
这些变量无需捕获,直接在 rewrite 目标中使用:
-
$args:原始请求的查询参数(如
?a=1&b=2) -
$query_string:同
$args - $uri:当前请求的 URI(不含域名和参数,已解码)
- $request_uri:原始完整 URI(含参数,未解码)
- $scheme、$host、$request_method 等也可用,但 rewrite 中较少用于跳转目标
示例:rewrite ^/old/(.*)$ /new/$1?from=old&$args last;
这里 $args 会原样保留并拼接到新 URL 后。
自定义变量需先用 set 定义
Nginx rewrite 中不能直接使用未声明的变量(比如 $myvar),必须先用 set 指令赋值:
set $redirect_to "/login"; rewrite ^/admin/.*$ $redirect_to?next=$request_uri redirect;
注意:
– set 必须在 rewrite 前(通常放在 location 块开头)
– 变量名不能含点号或特殊字符,建议用下划线
– set 支持引用其他变量,如 set $path "/api$v1";
引用时的常见陷阱
- 空捕获组会导致
$1为空字符串,不是未定义 —— 不会报错但可能产生意外路径 - 正则未匹配时,rewrite 不执行,变量引用无效(不会出错,只是跳过)
- 变量引用必须写在 rewrite 的 第二个参数(替换目标) 中,不能出现在正则里
- 如果目标中要输出字面量
$,需写成$$(例如$$1输出$1字符串)











