任何人都可以向我解释apache以什么顺序执行驻留在同一路径的不同级别中的.htaccess文件,以及其中的重写规则如何确定优先级?

例如,为什么不重写规则?

.htaccess在/blog中具有优先权?

.htaccess在/

RewriteEngine on
RewriteBase /
RewriteRule ^blog offline.html [L]


.htaccess在/blog

RewriteEngine On
RewriteBase /blog/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /blog/index.php [L]


PS:我不仅在寻找答案,而且还在寻找一种了解apache / mod_rewrite内部方法的方式...为什么对我来说比解决这个问题更重要,

#1 楼

我想您应该阅读Apache教程:.htaccess,主要是“如何应用指令”部分,其中指出:
.htaccess文件中的配置指令。应用于.htaccess文件
所在的
目录及其所有子目录
。但是,重要的是要
还记得在更高目录中的
.htaccess文件可能是
。指令按照找到后的顺序应用。因此,特定目录中的.htaccess文件可能会覆盖目录树中位于较高目录的.htaccess文件中的指令
。而这些
可能已经覆盖了更高的
指令,或者位于主服务器配置文件

给予完整的阅读,并且.htaccess不再是一个谜。

评论


mod_rewrite是一种特殊情况。重写规则自下而上应用。首先是子目录中的规则,然后是父目录中的规则。

– GetFree
2015年1月19日23:12

上面列出的文档适用于Apache 2.2。对于当前版本的apache,请转至此链接httpd.apache.org/docs/current/howto/htaccess.html

– SherylHohman
19年7月12日在4:01



#2 楼

您可以使用RewriteOptions inherit继承父目录的重写规则。但是,根据RewriteOptions上的文档,稍后将应用父目录的重写规则。

评论


即使没有该语句,也会应用父目录的重写指令(这有点令人困惑),但是我想这可以用于执行从父目录到子目录的虚拟拷贝+指令粘贴(可能具有不同的重写基础)。难怪mod_rewrite有时会弄乱你的头……嗯。

–西蒙东
2014年7月14日在3:08



@SimonEast“即使没有此语句,也会应用父目录的重写指令”-确定吗?你有参考吗?具体来说,默认情况下,mod_rewrite指令不被继承(与其他模块不同)。您可能需要在某个地方使用RewriteOptions InheritXXXX指令来继承指令。但是,在Apache 2.4+上,通过使用InheritDown选项(可以在父目录中指定)和随后控制子目录的服务器配置中,这变得更加复杂。

–怀特先生
2015年10月31日15:21