Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache RewriteRule未使用否定模式替换RewriteCond捕获组_Apache_.htaccess_Mod Rewrite - Fatal编程技术网

Apache RewriteRule未使用否定模式替换RewriteCond捕获组

Apache 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

我熟悉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/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


以上内容摘自本节,但从定义上看,否定重写模式与否定重写模式完全相同。

感谢您的文档参考,我显然错过了这一部分