多個 <Directory> 部分如何在 Apache 配置 (httpd.conf) 中工作?
例如,如果我的 ‘/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.考慮到第二部分是子目錄,
RewriteEngine On
第一<Directory>
部分中的不應該也適用於第二部分嗎?<Directory>
但我注意到我還需要RewriteEngine On
在第二<Directory>
部分添加規則。Jon Lin對
RewriteOptions Inherit
指令的作用的回答令人大開眼界,並間接回答了這個問題。“通常,如果您在特定子目錄中有一個 .htaccess 文件,則任何$$ mod_rewrite configuration settings $$在父目錄中被取代並且不會被應用。”
相關連結:
- http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriteoptions
- http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#vhosts
- 這是否意味著我也應該將第一
<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>
然後在“/var/www/example.com/public”和“/var/www/example.com/public/wp-content/cache/minify”目錄中放置一個 robots.txt 文件。兩者都帶有
noindex
HTTP 標頭。