$1、$2等变量代表正则捕获组内容,仅当rewrite模式含括号时生效;按左括号顺序编号,可拼接路径与参数,需注意空捕获及query string处理。

Nginx 的 rewrite 指令中,$1、$2 等变量代表正则表达式捕获组(即圆括号 () 匹配到的内容),它们在重写路径时非常关键——只要正则匹配成功,就能直接引用这些变量拼接新 URL。
确保正则中有捕获组才能用 $1、$2
只有在 rewrite 的匹配模式里用了带括号的正则,Nginx 才会生成 $1、$2 等变量。没有括号,就没有捕获,也就无法使用这些变量。
-
rewrite ^/old/(.*)$ /new/$1 permanent;→$1是.*匹配到的全部路径片段 -
rewrite ^/user/(\d+)/profile$ /profile?id=$1 permanent;→$1是用户 ID 数字 -
rewrite ^/article/(\d+)-(.*)\.html$ /article.php?id=$1&title=$2 permanent;→$1是 ID,$2是标题(URL 中的 slug)
注意捕获顺序和嵌套括号的层级
捕获组按左括号出现的顺序编号: 对应第一个 (...), 是第二个,依此类推。嵌套括号也严格按左括号计数,不是按“最外层”或“最内层”来算。
-
^/api/v(1|2)/users/(\d+)$→$1是版本号1或2,$2是用户 ID -
^/blog/(20\d{2})/(0[1-9]|1[0-2])/(\d+)$→$1年,$2月,$3日
跳转路径中可混合使用变量、固定字符串和查询参数
$1、$2 可以像普通字符串一样拼接,支持与斜杠、问号、& 等组合,也能参与 query string 构造。注意:Nginx 默认不自动保留原始 query string,需显式添加 $args 或手动构造。
- 保留原参数:
rewrite ^/old/(.*)$ /new/$1?$args permanent; - 替换并追加参数:
rewrite ^/item/(\d+)$ /product?id=$1&src=nginx redirect; - 路径重组 + 清除参数:
rewrite ^/p/([a-z]+)/(\d+)$ /$1/item-$2.html? permanent;(末尾?表示丢弃原 query)
常见陷阱:变量为空时可能导致意外路径
如果某捕获组没匹配到内容(比如 (\d+) 遇到非数字),整个 rewrite 不会执行;但若用的是 .* 或 .? 这类宽松匹配,$1 可能为空字符串,导致路径出现双斜杠或缺失段。
- 避免空捕获:
rewrite ^/page/(\d+)$ /pages/$1.html permanent;(用\d+而非.*保证非空) - 防御性写法:
rewrite ^/page/(\d+)(/.*)?$ /pages/$1.html permanent;(让$2可选,但只在需要时使用) - 调试技巧:临时加
return 200 "$1, $2";查看实际捕获值











