Darn花了一段时间追踪这个怪癖。我在httpd.conf
中定义了全局重写规则(或在包含中;赢得了不同之处),强制对某些网址模式进行外部重定向:
<Directory "/home/*">
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^.*wrong\.php$ http://example.net/void.html [R,L]
</IfModule>
</Directory>
对于没有使用mod_rewrite的.htaccess
文件的虚拟主机,这非常有用。但是,如果vhost完全使用任何mod_rewrite规则,则上述操作无效。即使只是RewriteEngine on
,没有指定任何规则,也足以取消vhost的httpd.conf
规则。这是预期的行为吗?在Apache / 2.2.15上。我曾尝试使用和不使用R&amp; L标志,有或没有<Directory>
包装,并在虚拟主机之前或之后声明,但规则根本无法工作。
有人拯救了我的理智并告诉我如何在httpd.conf
和.htaccess
合作中制定(非冲突)规则。它一定是可能的,我希望它是默认行为吗?
修改:根据要求提供样本.htaccess
文件:= ^ _ ^ =
RewriteEngine on
即便只是那个而且那个。足以让规则不匹配,似乎任何早期的mod_rewrite
都会被清除,并且当.htaccess
启动时会启动一个新的干净规则集。此外,任何其他行与mod_rewrite
有关导致相同的。如果我坚持.htaccess
,例如RewriteRule ^([X-Z])heRmaGerd[1-3]\.FOObAR$ /wherever/$1
(使用RewriteEngine on
或其自身作为唯一一行),肯定不匹配,但足以取消之前定义的所有内容。
答案 0 :(得分:1)
看起来(至少在2.4.6上)RewriteOptions inherit
有帮助,放在httpd.conf
或.htaccess
中。
根据docs,这应该只强制VirtualHost从主服务器配置继承规则,或者在每个目录上下文中继承父目录的.htaccess
配置,但我测试了它似乎解决了你的问题。
此外:
从父作用域继承的规则将在规则之后应用 在子范围中指定。