配置檔中的指令可能適用於整個伺服器,或者它們可能僅限於應用於特定目錄,檔,主機或URL。本文檔描述了如何使用配置片段容器或.htaccess
檔來更改其他配置指令的範圍。
配置片段容器的類型
有兩種基本類型的容器。大多數容器針對每個請求都會進行評估。隨附的指令僅適用於與容器匹配的請求。另一方面,<IfDefine>
,<IfModule>
和<IfVersion>
容器僅在伺服器啟動和重新啟動時進行評估。如果糨們的條件在啟動時為真,那麼所附的指令將適用於所有請求。如果條件不為真,則將忽略所附的指令。
<IfDefine>
指令包含只有在httpd命令行中定義了適當參數時才會應用的指令。例如,使用以下配置,僅當使用httpd -DClosedForNow
啟動伺服器時,所有請求才會重定向到另一個站點:
<IfDefine ClosedForNow>
Redirect / http://otherserver.example.com/
</IfDefine>
<IfModule>
指令與上面<IfDefine>
指令也非常相似,除了它包含只有在伺服器中有特定模組可用時才會應用的指令。模組必須在伺服器中靜態編譯,或者必須動態編譯,並且其LoadModule
行必須在配置檔中更早。只有在需要配置檔才能使用該命令時,才能使用該指令,無論是否安裝了某些模組。它不應該用於包含您希望一直工作的指令,因為它可以抑制有關丟失模組的有用錯誤消息。
在以下示例中,僅當mod_mime_magic
可用時才會應用MimeMagicFile
指令。
<IfModule mod_mime_magic.c>
MimeMagicFile conf/magic
</IfModule>
<IfVersion>
指令與<IfDefine>
和<IfModule>
非常相似,只不過它包含的指令只會在特定版本的伺服器執行時才會應用。該模組設計用於測試套件和大型網路,這些網路必須處理不同的httpd版本和不同的配置。
<IfVersion >= 2.1>
# this happens only in versions greater or
# equal 2.1.0.
</IfVersion>
<IfDefine>
,<IfModule>
和<IfVersion>
可以通過在測試前加上!
符號來應用否定條件。此外,這些部分可以嵌套以實現更複雜的限制。
檔系統和網站空間
最常用的配置節容器是更改檔系統或網站空間中特定位置的配置的容器。首先,瞭解兩者之間的區別非常重要。檔系統是操作系統可以看到的磁片視圖。例如,在默認安裝中,Apache位於Unix檔系統中的/usr/local/apache2
或Windows檔系統中的“C:/Program Files/Apache Group/Apache2
中。(請注意,正斜杠應始終用作Apache中的路徑分隔符號,即使對於Windows也是如此。)相反,網站空間是由Web伺服器提供並由客戶端查看的站點視圖。因此,webspace中的path/dir/
對應於Unix上默認Apache安裝的檔系統中的路徑/usr/local/apache2/htdocs/dir/
。網站空間不需要直接映射到檔系統,因為網頁可以從資料庫或其他位置動態生成。
檔系統容器
<Directory>
和<Files>
指令及其正則運算式對應項將指令應用於檔系統的某些部分。包含在<Directory>
部分中的指令適用於指定的檔系統目錄和該目錄的所有子目錄(以及這些目錄中的檔)。使用.htaccess
檔可以獲得相同的效果。例如,在以下配置中,將為/var/web/dir1
目錄和所有子目錄啟用目錄索引。
<Directory /var/web/dir1>
Options +Indexes
</Directory>
包含在<Files>
部分中的指令適用於具有指定名稱的任何檔,無論它位於何種目錄中。例如,以下配置指令在放置在配置檔的主部分時將拒絕訪問任何檔。檔案名為private.html
,無論它在哪里找到。
<Files "private.html">
Require all denied
</Files>
要處理在檔系統的特定部分中找到的檔,可以組合<Files>
和<Directory>
片段。例如,以下配置將拒絕訪問/var/web/dir1/private.html
,/var/web/dir1/subdir2/private.html
,/var/web/dir1/subdir3/private.html
以及其他在/var/web/dir1/
目錄下的private.html
實例。
<Directory "/var/web/dir1">
<Files "private.html">
Require all denied
</Files>
</Directory>
Webspace容器
另一方面,<Location>
指令及其正則運算式對應方更改了Webspace
中內容的配置。例如,以下配置可防止訪問以/private
開頭的任何URL路徑。它將適用於http://yoursite.example.com/private
,http://yoursite.example.com/private123
和http://yoursite.example.com/private/dir/file
的請求。html
以及以/private
字串開頭的任何其他請求。
<LocationMatch "^/private">
Require all denied
</LocationMatch>
<Location>
指令不需要與檔系統有任何關係。例如,以下示例顯示如何將特定URL映射到mod_status
提供的內部Apache HTTP Server處理程式。檔系統中不需要存在稱為伺服器狀態的檔。
<Location "/server-status">
SetHandler server-status
</Location>
重疊的Webspace
為了有兩個重疊的URL,必須考慮評估某些部分或指令的順序。對於<Location>
將是:
<Location "/foo">
</Location>
<Location "/foo/bar">
</Location>
另一方面,<Alias>
映射反之亦然:
Alias "/foo/bar" "/srv/www/uncommon/bar"
Alias "/foo" "/srv/www/common/foo"
ProxyPass
指令也是如此:
ProxyPass "/special-area" "http://special.example.com" smax=5 max=10
ProxyPass "/" "balancer://mycluster/" stickysession=JSESSIONID|jsessionid nofailover=On
通配符和正則運算式
<Directory>
,<Files>
和<Location>
指令都可以使用shell樣式的通配符,如C標準庫中的fnmatch
。字元*
匹配任何字元序列,?
匹配任何單個字元,[seq]
匹配seq
中的任何字元。/
字元不會被任何通配符匹配;
如果需要更靈活的匹配,每個容器都有一個正則運算式(正則運算式)對應<DirectoryMatch>
,<FilesMatch>
和<LocationMatch>
,它們允許在選擇匹配時使用與perl相容的正則運算式。但請參閱下麵有關配置合併的部分,以瞭解使用正則運算式部分將如何更改指令的應用方式。
更改所有用戶目錄配置的非正則運算式通配符部分可能如下所示:
<Directory "/home/*/public_html">
Options Indexes
</Directory>
使用正則運算式部分,可以一次拒絕訪問多種類型的圖像檔:
<FilesMatch "\.(?i:gif|jpe?g|png)$">
Require all denied
</FilesMatch>
包含命名組和反向引用的正則運算式將添加到環境中,並以大寫形式顯示相應的名稱。這允許從運算式和模組(如mod_rewrite
)中引用檔案名路徑和URL的元素。
<DirectoryMatch "^/var/www/combined/(?<SITENAME>[^/]+)">
require ldap-group "cn=%{env:MATCH_SITENAME},ou=combined,o=Example"
</DirectoryMatch>
布爾運算式<If>
指令根據可由布爾運算式表示的條件更改配置。例如,如果HTTP Referer標頭不以http://www.example.com/
開頭,則以下配置拒絕訪問。
<If "!(%{HTTP_REFERER} -strmatch 'http://www.example.com/*')">
Require all denied
</If>
什麼時候用什麼?
在檔系統容器和webspace容器之間進行選擇實際上非常簡單。將指令應用在位於檔系統中的對象時,請始終使用<Directory>
或<Files>
。將指令應用於不駐留在檔系統中的對象(例如從資料庫生成的網頁)時,請使用<Location>
。
在嘗試限制對檔系統中對象的訪問時,不要使用<Location>
。這是因為許多不同的網站空間位置(URL)可以映射到相同的檔系統位置,從而可以規避限制。例如,請考慮以下配置:
<Location "/dir/">
Require all denied
</Location>
如果請求是http://yoursite.example.com/dir/
,這可以正常工作。但是,如果使用不區分大小寫的檔系統呢? 然後,通過請求http://yoursite.example.com/DIR/
可以輕鬆規避限制。相反,<Directory>
指令將適用於從該位置提供的任何內容,無論其如何調用。(檔系統鏈接是一個例外。使用符號鏈接可以將同一目錄放在檔系統的多個部分中。<Directory>
指令將遵循符號鏈接而不重置路徑名。因此,為了最高級別的安全性,符號 應使用適當的Options
指令禁用鏈接。)
如果因為使用區分大小寫的檔系統而認為這些都不適用,請記住,還有許多其他方法可將多個網站空間位置映射到同一檔系統位置。因此,應該始終使用檔系統容器。但是,這條規則有一個例外。將配置限制放在<Location "/">
部分是非常安全的,因為無論具體的URL如何,本節都將適用於所有請求。