如果 .htaccess 使用 mod_rewrite,则 Apache httpd.conf mod_rewrite 取消
Posted
技术标签:
【中文标题】如果 .htaccess 使用 mod_rewrite,则 Apache httpd.conf mod_rewrite 取消【英文标题】:Apache httpd.conf mod_rewrite canceled if .htaccess uses mod_rewrite 【发布时间】:2017-04-05 17:02:51 【问题描述】:该死的跟踪这个怪癖花了一些时间。我在httpd.conf
中定义了全局重写规则(或在包含中;不会产生影响),以强制对某些 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
,没有指定任何规则,也足以取消虚拟主机的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/$1
(以RewriteEngine on
,或单独作为唯一行),它肯定不会匹配,但足以抵消之前定义的所有内容。
【问题讨论】:
你确定它被取消了吗?还是您有与新请求匹配的规则?后者似乎更有可能,但没有你的.htaccess
,我无能为力。
嗯,它肯定不会发生,所以我认为它被取消了。 .htaccess
中没有后面的匹配规则。就像我说的,即使只是“RewriteEngine on”,作为.htaccess
文件中唯一的东西,也足以让它不会发生。如果我将其注释掉,httpd.conf
规则将按预期匹配。跨多个域测试的相同模式。此外,*.conf
文件中的任何地方都没有其他 mod_rewrite 使用,所以触发这种行为的原因对我来说是个谜。
我可以确认你没有疯 :),它的行为确实如此,即使在 2.4.6 上也是如此
【参考方案1】:
看起来(至少在 2.4.6 上)RewriteOptions inherit
有帮助,放在 httpd.conf
或 .htaccess
中。
根据docs,这应该只强制 VirtualHost 从主服务器配置继承规则,或者在每个目录上下文中继承父目录的 .htaccess
配置,但我测试过,它似乎解决了你的问题。
还有:
从父范围继承的规则在规则之后应用 在子范围内指定。
【讨论】:
太棒了,这解决了。但是,我看到声明RewriteOptions inherit
必须进入子 .htaccess
,在父上下文中声明它(无论如何在 httpd.conf
中)没有效果。似乎是 2.2.x 上的唯一方法(这是我在 CentOS 上所能得到的)。哦,好吧,我可以处理那么多代码复制!久违了,wp-login.php
和 xmlrpc.php
之类的邪恶寻求者!所有的 httpd 错误日志垃圾都让我发疯了,很难从大量垃圾中发现任何实际错误。以上是关于如果 .htaccess 使用 mod_rewrite,则 Apache httpd.conf mod_rewrite 取消的主要内容,如果未能解决你的问题,请参考以下文章
如果 url 包含使用 htaccess 的特定字符串,则重定向
如果我使用.htaccess mod重写规则,PHP Cookie不可用