htaccess执行顺序和优先级


19

谁能向我解释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:我不只是寻找一个答案,但换一种方式理解阿帕奇/ mod_rewrite的内部...... 为什么是我比更重要的是如何解决这个问题,

Answers:


20

我想您应该阅读Apache教程:.htaccess,主要是“如何应用指令”部分,其中指出:

.htaccess文件中找到的配置指令将应用于.htaccess文件所在的目录及其所有子目录。但是,同样重要的是要记住,更高目录中可能存在.htaccess文件。指令按照找到的顺序应用。因此,特定目录中的.htaccess文件可能会覆盖在目录树中较高位置的.htaccess文件中找到的指令。而这些反过来可能在更高的位置或在主服务器配置文件本身中找到了覆盖的指令。

对其进行完整阅读,然后.htaccess将不再是一个谜。


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

上面列出的文档适用于Apache 2.2。对于Apache的当前版本,请访问以下链接,而不是httpd.apache.org/docs/current/howto/htaccess.html
SherylHohman

3

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


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

2
@SimonEast“即使没有此语句,也会应用父目录的重写指令”-确定吗?你有参考吗?具体而言,默认情况下继承mod_rewrite指令(与其他模块不同)。您将需要一个指令地方的被继承的指令。但是,在Apache 2.4+上,这变得更加复杂,可以在目录中指定选项,然后通过服务器配置控制子目录。RewriteOptions InheritXXXXInheritDown
怀特先生
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.