我熟悉Regexp,RewriteCond和RewriteRule。
问题是我的RewriteRule没有替换最后一个RewriteCond中的捕获组。
Apache v2.4.10
RewriteCond %{REQUEST_URI} !(apps/)?index.php
RewriteRule ^(apps/)?(.*)$ /%1index.php?$2 [QSA,NC,L]
根据文档,%1
应该替换为RewriteCond中的捕获组:(apps/)
但不是。{/ p>
Apache调试:
RewriteCond: input='/apps/x/y' pattern='!(apps/)?index.php' => matched
rewrite 'x/y' -> '/index.php?x/y'
调试确实说Cond是匹配的,因此它应该捕获该组。
它表示输入包含apps/
部分。
但是,重写不考虑它......
添加额外的(无用的)RewriteCond以强制匹配但不用!
否定模式使其工作,所以捕获组确实被捕获并替换:< / p>
RewriteCond %{REQUEST_URI} !(apps/)?index.php
RewriteCond %{REQUEST_URI} ^/(apps/)?
RewriteRule ^(apps/)?(.*)$ /%1index.php?$2 [QSA,NC,L]
有什么想法吗?这是使用!
的正则表达式进行的某种优化,以便它不会评估捕获组吗?这应该报告为错误吗?是否记录在哪里?
答案 0 :(得分:1)
在否定模式上没有捕获任何内容,因为根据定义,模式与不匹配,因此无需捕获。它在文档中提到过,但如果你仔细想想也很明显。怎么可能没有捕获到的东西?捕获来自匹配,而不是来自正则表达式的内容。它可能包括通配符或其他可变模式。在你的情况下,它没有。如果确实如此,它会在捕获中放入什么?没有什么可用的。如果它没有,你已经知道它是什么,所以不需要捕捉&#34;它。没有用于否定模式捕获的地方。
来自文档:
注意强>
使用NOT字符否定模式时,不能在该模式中包含分组通配符部分。这是因为,当模式不匹配时(即,否定匹配),组没有内容。因此,如果使用了否定模式,则不能在替换字符串中使用$ N!
以上来自RewriteRule部分,但根据定义,对于否定的RewriteCond模式显然相同。