Apache 2.0 中文文檔 | ||||
|---|---|---|---|---|
| ||||
| 2004-02-11 Apache 譯者:kajaa http://www.douzhe.com/ApacheManual/ | ||||
| 配置段容器的類(lèi)型 相關(guān)模塊 core mod_proxy 相關(guān)指令 <Directory> <DirectoryMatch> <Files> <FilesMatch> <IfDefine> <IfModule> <Location> <LocationMatch> <Proxy> <ProxyMatch> <VirtualHost> 容器有兩種基本類(lèi)型。大多數容器是針對各個(gè)請求的,包含于其中的指令僅對與容器匹配的請求起作用,而容器<IfDefine>和<IfModule>僅在啟動(dòng)和重新啟動(dòng)中起作用,如果條件成立,則其中的指令有效,否則會(huì )被忽略。 <IfDefine>容器中的指令只有在httpd命令行中設定了適當的參數后才有效。下例中,只有在服務(wù)器用httpd -DClosedForNow方式啟動(dòng)時(shí),所有的請求才會(huì )被重定向到另一個(gè)站點(diǎn)。 <IfDefine ClosedForNow> Redirect / http://otherserver.example.com/ </IfDefine> <IfModule>容器很相似,但是其中的指令只有當服務(wù)器中存在特定的模塊時(shí)有效,或者是被靜態(tài)地編譯進(jìn)了服務(wù)器,或者是被動(dòng)態(tài)裝載進(jìn)了服務(wù)器,而且,配置文件中其裝載指令行LoadModule必須在出現在此容器之前。這個(gè)容器應該僅用于你希望無(wú)論特定模塊裝了還是沒(méi)裝,配置文件都能正常運轉的場(chǎng)合;而不應該用于容器中的指令在任何情況下都必須生效的場(chǎng)合,因為它會(huì )抑制類(lèi)似模塊沒(méi)找到的有用的出錯信息。 下例中,MimeMagicFiles指令僅當mod_mime_magic模塊存在時(shí)才有效。 <IfModule mod_mime_magic.c> MimeMagicFile conf/magic </IfModule> <IfDefine>和<IfModule>都可以在條件前加"!"以實(shí)現條件的否定,而且都可以嵌套以實(shí)現更復雜的限制。 文件系統和網(wǎng)絡(luò )空間 改變一個(gè)在文件系統和網(wǎng)絡(luò )空間的位置的配置段是最常用的。首先必須理解這兩個(gè)概念的區別,文件系統是在操作系統中所看見(jiàn)的磁盤(pán)上的分布,比如,在Unix文件系統中,Apache會(huì )被默認地安裝到/usr/local/apache2,在Windows文件系統中,會(huì )裝到"c:/Program Files/Apache Group/Apache2"(注意:Apache始終用斜杠而不是反斜杠作為路徑的分隔符,即使是在Windows中)。相反,網(wǎng)絡(luò )空間是客戶(hù)在瀏覽器中所看見(jiàn)的站點(diǎn)上的分布,所以網(wǎng)絡(luò )空間中的路徑 /dir/ 對應于A(yíng)pache在Unix文件系統中的默認安裝路徑 /usr/local/apache2/htdocs/dir/。由于網(wǎng)頁(yè)可以從數據庫或其他地方動(dòng)態(tài)生成,因此,網(wǎng)絡(luò )空間無(wú)須直接映射到文件系統。 文件系統容器 <Directory>和<Files>是針對文件系統的指令。<Directory>段中的指令作用于指定的文件系統目錄及其所有子目錄,.htaccess 文件可以達到同樣的效果。下例中,/var/web/dir1及其所有子目錄被允許目錄列表。 <Directory /var/web/dir1> Options +Indexes </Directory> <Files>段中的指令作用于特定的文件名,而無(wú)論這個(gè)文件實(shí)際存在于哪個(gè)目錄。下例中的配置指令如果出現在配置文件的主服務(wù)器段,則會(huì )拒絕對位于任何目錄下的private.html的訪(fǎng)問(wèn)。 <Files private.html> Order allow,deny Deny from all </Files> <Files>和<Directory>段的組合可以作用于文件系統中的特定文件。下例中的配置會(huì )拒絕對 /var/web/dir1/private.html, /var/web/dir1/subdir2/private.html, /var/web/dir1/subdir3/private.html 等任何/var/web/dir1/目錄下的private.html的訪(fǎng)問(wèn)。 <Directory /var/web/dir1> <Files private.html> Order allow,deny Deny from all </Files> </Directory> 網(wǎng)絡(luò )空間容器 <Location>是針對網(wǎng)絡(luò )空間的指令。下例中的配置會(huì )拒絕任何對以/private開(kāi)頭的URL的訪(fǎng)問(wèn),如 http://yoursite.example.com/private, http://yoursite.example.com/private123, http://yoursite.example.com/private/dir/file.html 等所有以/private開(kāi)頭的URL。 <Location /private> Order Allow,Deny Deny from all </Location> <Location>指令無(wú)須文件系統的支持,下例演示了如何映射特定的URL到由mod_status提供的Apache內部處理器,而并不要求文件系統中確實(shí)存在server-status。 <Location /server-status> SetHandler server-status </Location> 通配符和正則表達式 <Directory>,<Files>, 和<Location>指令可以使用類(lèi)似C標準庫中的fnmatch的外殼通配符。符號"*"匹配任何字符串,"?"匹配任何單個(gè)的字符,"[seq]" 匹配seq序列中的任何字符,符號"/"不匹配為任何通配符所匹配,所以不能顯式使用。 這些指令都有一個(gè)正則的配對指令,<DirectoryMatch>, <FilesMatch>和<LocationMatch>,可以使用與perl一致的正則表達式,以提供更復雜的匹配。但是還須注意下文配置的合并中有關(guān)使用正則表達式會(huì )如何作用于配置指令的內容。 下例使用非正則表達式的通配符來(lái)改變所有用戶(hù)目錄的配置: <Directory /home/*/public_html> Options Indexes </Directory> 下例使用正則表達式一次性拒絕對多種圖形文件的訪(fǎng)問(wèn): <FilesMatch .(?i:gif|jpe?g|png)$> Order allow,deny Deny from all </FilesMatch> 什么情況下用什么 選擇使用文件系統容器還是使用網(wǎng)絡(luò )空間容器其實(shí)很簡(jiǎn)單。當指令應該作用于文件系統時(shí),總是用<Directory>或者<Files>;而當指令作用于不存在于文件系統的對象時(shí),就用<Location>,比如一個(gè)由數據庫生成的網(wǎng)頁(yè)。 不要試圖用<Location>去限制對文件系統中對象的訪(fǎng)問(wèn),因為許多不同的網(wǎng)絡(luò )空間路徑可能會(huì )映射到同一個(gè)文件系統目錄,導致你的訪(fǎng)問(wèn)限制被突破。比如: <Location /dir/> Order allow,deny Deny from all </Location> 上述配置對http://yoursite.example.com/dir/請求的確起作用。但是設想在一個(gè)不區分大小寫(xiě)的文件系統中,這個(gè)訪(fǎng)問(wèn)限制會(huì )被http://yoursite.example.com/DIR/請求輕易突破。而<Directory>指令才會(huì )真正作用于對這個(gè)位置的任何形式的請求。(但是有一個(gè)例外,就是Unix文件系統中的連接,符號連接可以使同一個(gè)目錄出現在文件系統中的多個(gè)位置。<Directory>指令能不經(jīng)過(guò)重置路徑名而跟隨符號連接,因此,對于安全要求最高的,應該用Options指令禁止對符號連接的跟隨。) 不要認為使用大小寫(xiě)敏感的文件系統就無(wú)所謂了,因為有很多方法會(huì )將不同的網(wǎng)絡(luò )空間路徑映射為同一個(gè)文件系統路徑,所以,能使用文件系統容器時(shí)就應該使用。但是,也有一個(gè)例外,就是,把訪(fǎng)問(wèn)限制放在<Location/>段中可以很安全地作用于除了某些特定的以外所有的URL。 虛擬主機 <VirtualHost>容器作用于特定的主機,對同一個(gè)機器上的具有不同配置的多個(gè)主機提供支持。詳見(jiàn):虛擬主機文檔(Virtual Host Documentation)。 代理 <Proxy>和<ProxyMatch>容器中的指令僅作用于指定URL所匹配的通過(guò)mod_proxy的代理服務(wù)器訪(fǎng)問(wèn)的站點(diǎn)。下例中的配置會(huì )拒絕通過(guò)代理服務(wù)器訪(fǎng)問(wèn)cnn.com站點(diǎn)。 <Proxy http://cnn.com/*> Order allow,deny Deny from all </Proxy> 允許使用的指令 查閱指令的作用域,就可以知道哪些指令可以出現在哪些段中。從語(yǔ)義上看,允許在<Directory>段中使用的指令當然也可以在<DirectoryMatch>, <Files>, <FilesMatch>, <Location>, <LocationMatch>, <Proxy>和<ProxyMatch>段中使用,但是有幾個(gè)例外: AllowOverride指令只能出現在<Directory>段中; Options中的FollowSymLinks和 SymLinksIfOwnerMatch只能出現在<Directory>段或者.htaccess文件中; Options指令不能用于<Files>和<FilesMatch>段。 配置段的合并 配置段會(huì )按非常特別的順序依次生效,由于這會(huì )對配置指令的處理結果產(chǎn)生重大影響,理解它的流程尤為重要。 合并的順序是: <Directory> (除了正則表達式)和.htaccess同時(shí)處理;(如果允許的話(huà),.htaccess的設置會(huì )覆蓋<Directory>的設置) <DirectoryMatch> (和<Directory ~>) <Files>和<FilesMatch>同時(shí)處理; <Location>和<LocationMatch>同時(shí)處理; 除了<Directory>,每個(gè)組都按它們在配置文件中出現的順序被依次處理,而<Directory>組,會(huì )按字典順序由短到長(cháng)被依次處理。例如,<Directory /var/web/dir>會(huì )先于<Directory /var/web/dir/subdir>被處理。如果有多個(gè)指向同一個(gè)目錄的<Directory>段,則按它們在配置文件中的順序被依次處理。用Include指令包含進(jìn)來(lái)的設置被視為按原樣插入到Include指令的位置。 位于<VirtualHost>段中的配置段在外部相對應的段處理完畢以后再處理,這樣就允許虛擬主機覆蓋主服務(wù)器的設置。 后面的段覆蓋前面的相應的段。 技術(shù)說(shuō)明 其實(shí),在名稱(chēng)翻譯階段(即,用Aliases和DocumentRoots來(lái)映射URL到文件)之前,會(huì )有一個(gè)<Location>/<LocationMatch>的序列被處理,而在名稱(chēng)翻譯結束后,這個(gè)序列的處理結果則被完全拋棄。 一些例子 這是一個(gè)假設的演示合并順序的例子。如果這些指令都起作用,則會(huì )按A > B > C > D > E的順序依次生效。 <Location /> E </Location> <Files f.html> D </Files> <VirtualHost *> <Directory /a/b> B </Directory> </VirtualHost> <DirectoryMatch "^.*b$"> C </DirectoryMatch> <Directory /a/b> A </Directory> 在這個(gè)更具體的例子中,無(wú)論在<Directory>段中加了多少訪(fǎng)問(wèn)限制,由于<Location>段將會(huì )被最后處理,從而會(huì )允許不加限制的對服務(wù)器的訪(fǎng)問(wèn),可見(jiàn)合并的順序是很重要的,千萬(wàn)小心! <Location /> Order deny,allow Allow from all </Location> # Woops! This <Directory> section will have no effect # 哇呀!這個(gè)<Directory>段居然不起作用 <Directory /> Order allow,deny Allow from all Deny from badguy.example.com </Directory> | ||||
聯(lián)系客服