例如,如果我的“/etc/apache2/httpd.conf”如下所示:
<Directory />
AllowOverride None
</Directory>
<Directory /home>
AllowOverride FileInfo
</Directory>
后一条AllowOverride
规则将覆盖目录的前一条规则/home
。这部分很清楚。
但是如果我的 httpd.conf 文件看起来像这样会发生什么?
<Directory /var/www/example.com/public>
AllowOverride None
Options -MultiViews
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
[...]
</IfModule>
[...]
</Directory>
<Directory /var/www/example.com/public/wp-content/cache/minify>
<IfModule mod_rewrite.c>
# WHY IS 'RewriteEngine On' REQUIRED?
RewriteEngine On
RewriteBase /wp-content/cache/minify/
RewriteRule [...]
</IfModule>
</Directory>
问题:
考虑到第二部分是子目录,
RewriteEngine On
第一部分中的是否也<Directory>
应该适用于第二部分?但我注意到我也需要在第二部分中添加规则。<Directory>
RewriteEngine On
<Directory>
这是否意味着我也应该将第一部分的所有通用规则复制
<Directory>
到第二<Directory>
部分?例如,,AllowOverride None
等Options -MultiViews
。
答案1
1.考虑到第二部分是子目录,
RewriteEngine On
第一<Directory>
部分中的 是否也适用于第二部分?但我注意到我也需要在第二部分中添加规则。<Directory>
RewriteEngine On
<Directory>
Jon Lin 的回答该指令的作用RewriteOptions Inherit
令人大开眼界,并间接回答了这个问题。
“通常情况下,如果您在特定的子目录中有一个 .htaccess 文件,则父目录中的任何 [mod_rewrite 配置设置] 都将被取代并且不会应用。”
相关链接:
http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriteoptions
http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#vhosts
2. 这是否意味着我也应该将第一部分的所有通用规则复制
<Directory>
到第二<Directory>
部分?例如AllowOverride None
,,,Options -MultiViews
等等。
不,由于 '/var/www/example.com/public' 的所有规则(在<Directory /var/www/example.com/public>
部分中设置)也适用于其子目录,因此无需再次将它们复制到<Directory /var/www/example.com/public/wp-content/cache/minify>
部分中。
发现这一点很容易。
我在<Directory /var/www/example.com/public>
httpd.conf 的部分中添加了以下内容:
<IfModule mod_headers.c>
# Set noindex header for robots.txt
<FilesMatch "robots.txt">
Header set X-Robots-Tag "noindex"
</FilesMatch>
</IfModule>
然后将 robots.txt 文件放入 '/var/www/example.com/public' 和 '/var/www/example.com/public/wp-content/cache/minify' 目录中。两者都带有noindex
HTTP 标头。