【问题标题】:Apache RewriteRule not substituting RewriteCond capturing group with negated patternApache RewriteRule 没有用否定模式替换 RewriteCond 捕获组
【发布时间】:2017-06-03 12:29:37
【问题描述】:

我熟悉 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/) 但不是。

Apache 调试:

RewriteCond: input='/apps/x/y' pattern='!(apps/)?index.php' => matched
rewrite 'x/y' -> '/index.php?x/y'

调试确实说 Cond 是匹配的,因此它应该捕获该组。

它表示输入包含apps/ 部分。

但是,重写不考虑它......

如下添加一个额外的(无用的)RewriteCond 来强制匹配,但不使用 ! 否定模式 确实 使其工作,因此确实捕获并替换了捕获组:

RewriteCond %{REQUEST_URI} !(apps/)?index.php
RewriteCond %{REQUEST_URI} ^/(apps/)?
RewriteRule ^(apps/)?(.*)$ /%1index.php?$2 [QSA,NC,L]

有什么想法吗?这是来自带有! 的正则表达式的某种优化,因此它不会评估捕获组?这应该被报告为错误吗?它在任何地方都有记录吗?

【问题讨论】:

    标签: apache .htaccess mod-rewrite


    【解决方案1】:

    在否定模式上没有捕获任何内容,因为根据定义,模式不匹配,因此没有没有可捕获的内容。它在文档中提到过,但如果你仔细想想,它也很明显。不存在的东西怎么可能被捕获?捕获来自匹配而不是来自正则表达式的内容。它可能包括通配符或其他可变模式。在你的情况下它没有。如果是这样,它将在捕获中放入什么?没有什么可以使用的。如果没有,您已经知道它是什么,因此无需“捕获”它。没有地方可以使用否定模式进行捕获。

    来自文档:

    注意

    当使用 NOT 字符来否定模式时,您不能在该模式中包含分组的通配符部分。这是因为,当模式不匹配(即否定匹配)时,组没有内容。因此,如果使用否定模式,则不能在替换字符串中使用 $N!

    以上来自RewriteRule 部分,但根据定义,对于否定的 RewriteCond 模式显然相同。

    【讨论】:

    • 感谢您的文档参考,我显然错过了那部分
    猜你喜欢
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 2012-02-29
    • 2015-01-27
    • 2016-02-07
    相关资源
    最近更新 更多