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