2016-11-22 62 views
1

补充一点,它需要一段时间才能跟踪这个问题。我在httpd.conf定义的全局重写规则(或者在包括;不会有所作为),迫使某些URL模式的外部重定向:如果.htaccess使用mod_rewrite,Apache httpd.conf将取消mod_rewrite

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

这个工程的辉煌那并不是任何虚拟主机t有一个使用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有关的任何其他行也会导致相同。如果我坚持使用例如.htaccessRewriteRule ^([X-Z])heRmaGerd[1-3]\.FOObAR$ /wherever/$1(与RewriteEngine on,或本身作为唯一线),它肯定不会匹配,但足以抵消之前定义的所有内容。

+0

你确定它被取消了吗?还是说你有一条与新请求匹配的规则?后者似乎更有可能,但没有你的'.htaccess',我没有太多的帮助你。 – Walf

+0

那肯定没有发生,所以我认为它被取消了。 '.htaccess'中没有后续的匹配规则。就像我说的那样,即使仅仅是“RewriteEngine on”,作为“.htaccess”文件中的唯一东西,也足以使它不会发生。如果我将它注释掉,那么'httpd.conf'规则就像预期的那样匹配。在几个域中测试了相同的模式。另外,在'* .conf'文件中没有其他的mod_rewrite被使用,所以对于我来说触发这种行为是个谜。 –

+0

我可以证实你并不疯狂:),它真的表现如此,即使在2.4.6 –

回答

1

看起来像(至少在2.4.6)​​帮助,放置在httpd.conf.htaccess

根据docs,这应该只是强制虚拟主机继承规则从主服务器配置,或目录级的继承父目录的.htaccess配置,但我测试,它似乎解决您的问题。

另外:

规则从父范围继承了子范围指定的规则 后应用。

+0

辉煌,这解决了它。但是,我发现声明'RewriteOptions inherit'必须放入子''.htaccess'中,并将其声明在父上下文中(无论如何,在'httpd.conf'中)不起作用。似乎是2.2.x上的唯一方法(这是我可以在CentOS上得到的所有东西)。噢,那么多的代码复制我可以处理!很久以前,'wp-login.php'和'xmlrpc.php'的邪恶追求者和什么都没有!所有的httpd错误日志垃圾令我疯狂,难以发现大量垃圾中的任何实际错误。 –