Apache RewriteRule未使用否定模式替换RewriteCond捕获组
我熟悉Regexp、RewriteCond和RewriteRule 问题是,我的重写规则不能替换上一次重写中的捕获组 Apache v2.4.10Apache RewriteRule未使用否定模式替换RewriteCond捕获组,apache,.htaccess,mod-rewrite,Apache,.htaccess,Mod Rewrite,我熟悉Regexp、RewriteCond和RewriteRule 问题是,我的重写规则不能替换上一次重写中的捕获组 Apache v2.4.10 RewriteCond %{REQUEST_URI} !(apps/)?index.php RewriteRule ^(apps/)?(.*)$ /%1index.php?$2 [QSA,NC,L] 根据文档,在重写条件中,(apps/)应将%1替换为捕获组,但事实并非如此 Apache调试: RewriteCond: input='/apps/x
RewriteCond %{REQUEST_URI} !(apps/)?index.php
RewriteRule ^(apps/)?(.*)$ /%1index.php?$2 [QSA,NC,L]
根据文档,在重写条件中,(apps/)
应将%1
替换为捕获组,但事实并非如此
Apache调试:
RewriteCond: input='/apps/x/y' pattern='!(apps/)?index.php' => matched
rewrite 'x/y' -> '/index.php?x/y'
调试确实表明Cond是匹配的,因此它应该捕获组
它表示输入包括apps/
部分
<>但是,重写没有考虑…
添加一个额外的(无用的)重写条件,如下所示,以强制匹配,但不使用否定模式代码>确实起作用,因此捕获组确实被捕获并替换:
RewriteCond %{REQUEST_URI} !(apps/)?index.php
RewriteCond %{REQUEST_URI} ^/(apps/)?
RewriteRule ^(apps/)?(.*)$ /%1index.php?$2 [QSA,NC,L]
有什么想法吗?这是来自带有的regexp的某种优化吗代码>这样它就不会评估捕获组了吗?这是否应报告为错误?在任何地方都有记录吗?在否定的模式上没有捕获任何内容,因为根据定义,该模式不匹配,因此没有可捕获的内容。文档中提到了这一点,但如果您仔细想想,这一点也很明显。不在那里的东西怎么可能被抓获?捕获来自匹配,而不是正则表达式的内容。它可以包括通配符或其他可变模式。在你的情况下不是这样的。如果是的话,它会把什么放在捕获中?没什么用的。当它不存在时,您已经知道它是什么,所以不需要“捕获”它。没有地方可以用否定的模式进行捕获
从文档中:
注意
使用NOT字符对模式求反时,不能在该模式中包含分组通配符部分。这是因为,当模式不匹配(即否定匹配)时,组没有内容。因此,如果使用了否定模式,则不能在替换字符串中使用$N
以上内容摘自本节,但从定义上看,否定重写模式与否定重写模式完全相同。感谢您的文档参考,我显然错过了这一部分