.htaccess指令是否向下应用于包含这些文件夹的子文件夹和子文件夹?

时间:2015-03-25 23:30:43

标签: wordpress apache .htaccess mod-rewrite multisite

我有下面详细介绍的.htaccess文件,其中包含HTTP_REFERER,HTTP_USER_AGENT和WordPress的某些指令。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_REFERER} acertainwebsite\.com [NC,OR]
RewriteCond %{HTTP_USER_AGENT} acertainwebsite.com [NC]
RewriteRule .* - [F]

RewriteBase /
RewriteRule ^index\.php$ - [L]
# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) wordpress/$2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ wordpress/$2 [L]
RewriteRule . index.php [L]
</IfModule>

我在使用FreeBSD的VPS上运行。我不确定如何测试根.htaccess文件中的指令RewriteCond%{HTTP_REFERER}和RewriteCond%{HTTP_USER_AGENT}是否在较低级别的子目录中强制执行。

最新版本的Wordpress 4.1.1。安装时使用子目录结构选项打开/启用多站点选项。

我怀疑某些引荐来源流量可能会超过根目录下的.htaccess文件。我在某处读到.htaccess文件中的指令向上级联,Apache首先在子目录中查找,然后在父项中查找,然后在父项的父项中查找。

所以这就是问题所在。我是否必须将.htaccess文件放在多站点安装的每个子目录中?或者我可以在多站点安装的根目录中使用单个.htaccess文件吗?

如果我必须在每个多站点域子目录中都有一个.htaccess文件,那么在子域中放置一个空的.htaccess文件就足够了吗?这是否会引发向上级联检查执法?

如果您对这可行的方法有一个很好的解释,或者更好地解释它的另一个来源,请告诉我。感谢!!!

1 个答案:

答案 0 :(得分:0)

htaccess文件在父目录和子目录之间的工作方式实际上取决于指令。一些指令使用父htaccess指令并仅在子目录中应用这些指令的更严格子集(如涉及权限的指令)和一些指令,子目录完全优先于父htaccess中的任何内容(与mod_rewrite一样)。

关于mod_rewrite的事情是,如果子目录的htaccess文件中有规则,只会执行那些规则。除非子目录包含RewriteOptions Inherit的某些变体以包含父htaccess规则,否则将完全忽略父htaccess文件中的任何规则。在Apache 2.2中,继承规则仅意味着父规则将附加到子目录中规则的末尾,而2.4允许父规则的更具体的附加/前置。

如果你的子目录中有一个应用程序,比如wordpress,那么这些规则将会生效,而父目录中的任何规则都将被完全忽略(比如你的引用规则)。您需要做的是将这些规则复制到子目录htaccess文件中(在这种情况下,如果您希望它们被应用,则将它们放在上面已经存在的任何规则中)。

如果你有没有任何重写规则的htaccess文件(或没有)的子文件夹,那么父目录中的规则将生效。