Apache RewriteRule 中圆括号创建捕获分组,内容按左括号顺序存入 $1、$2 等;非捕获分组 (?:...) 不生成 $N;跨 RewriteCond 需用 %1、%2;特殊字符需转义;嵌套括号按出现顺序编号。

Apache 的 RewriteRule 中使用圆括号 () 创建捕获分组,匹配的内容会按顺序存入 $1、$2 等变量,供重写目标或条件中引用。
基本写法:用括号包裹要捕获的部分
在正则表达式中,把想提取的片段用 () 包起来。Apache 会从左到右依次编号:
-
RewriteRule ^/user/(\d+)/(.+)$ /profile.php?id=$1&name=$2 [L]
匹配/user/123/john,$1是123,$2是john - 注意:非捕获分组
(?:...)不产生$N,仅用于逻辑分组,不推荐初学者使用
捕获范围只限当前 RewriteRule 的正则部分
分组只在该条 RewriteRule 的 pattern(第一个参数)里有效,不能跨规则或在 RewriteCond 中直接用 引用(RewriteCond 有自己的 %1、%2):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 错误写法:
RewriteCond %{REQUEST_URI} ^/old/RewriteRule ^/old/(.*)$ /new/$1 [L]—— 这里$1是有效的,因为捕获在 rule 自身 pattern 中 - 正确跨条件引用:
RewriteCond %{REQUEST_URI} ^/api/(v\d+)/(.+)$RewriteRule ^/api/.+$ /dispatch.php?version=%1&path=%2 [L]—— 条件里的捕获用%1、%2
转义括号和特殊字符
如果 URL 中本身含字面意义的括号(如 /page(1).html),需用反斜杠转义:
RewriteRule ^/page\((\d+)\)\.html$ /page.php?page=$1 [L]- 其他需转义的字符:点
\.、加号\+、问号\?、星号\*等,否则会被当作正则元字符处理
避免嵌套捕获导致编号混乱
多个括号嵌套时,编号仍按左括号出现顺序,不是按层级:
-
RewriteRule ^/(a(b(c)))$ /test.php?outer=$1&middle=$2&inner=$3 [L]
对/abc,$1=abc,$2=bc,$3=c - 如只需最内层,可改用非捕获外层:
^/(?:a(?:b(c)))$,此时只有$1=c

















