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