Apache httpd.conf mod_rewrite 如果 .htaccess 使用 mod_rewrite 则取消

Apache httpd.conf mod_rewrite canceled if .htaccess uses mod_rewrite

该死的,花了一段时间才找到这个怪癖。我在 httpd.conf 中定义了全局重写规则(或在 include 中;不会有什么不同),以强制对某些 URL 模式进行外部重定向:

<Directory "/home/*">
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteRule ^.*wrong\.php$ http://example.net/void.html [R,L]
    </IfModule>
</Directory>

这对于没有使用 mod_rewrite 的 .htaccess 文件的任何虚拟主机都非常有效。但是,如果虚拟主机根本使用任何 mod_rewrite 规则,则上述内容不起作用。即使只是 RewriteEngine on,没有指定任何规则,也足以抵消 vhost 的 httpd.conf 规则。这是预期的行为吗?在 Apache/2.2.15。我尝试过使用和不使用 R & L 标志,使用和不使用 <Directory> 包装,并在虚拟主机之前或之后声明,但这些规则根本行不通。

有人拯救我的理智并告诉我如何让 httpd.conf.htaccess 中的(不冲突的)规则一起工作。这一定是可能的,我希望它是默认行为?

编辑: 根据要求,示例 .htaccess 文件:=^_^=

RewriteEngine on

即使只是那样。足以使规则不匹配,似乎任何早期的 mod_rewrite 都被清除,并且在 .htaccess 启动时开始一个新的干净规则集。此外,任何其他与 mod_rewrite 有关的行原因一样。如果我坚持 .htaccess 例如RewriteRule ^([X-Z])heRmaGerd[1-3]\.FOObAR$ /wherever/(加上 RewriteEngine on,或者单独作为唯一的一行),它肯定不会匹配,但足以抵消之前定义的所有内容。

看起来(至少在 2.4.6 上)RewriteOptions inherit 有帮助,放在 httpd.conf.htaccess 中。

根据docs,这应该只强制 VirtualHost 从主服务器配置继承规则,或者在每个目录上下文中继承父目录的 .htaccess 配置,但我测试过,它似乎解决您的问题。

还有:

Rules inherited from the parent scope are applied after rules specified in the child scope.