Apache 2.2配置段和容器

以下內容摘自筆者編著的《網管員必讀——網絡應用》(第2版)一書:

 

3.2.2  Apache 2.2配置段和容器

“配置段”和“容器”都是用來指定配置文件的作用範圍的。配置文件中指令的作用範圍可能是整個服務器,也可能是特定的目錄、文件、主機、URL。本節將要介紹的是如何使用配置段及.htaccess文件來改變配置指令的作用範圍。

1配置段和容器的類型

配置段的類型包括在coremod_versionmod_proxy 3個模塊中可以使用的指令包括<Directory><DirectoryMatch><Files><FilesMatch><IfDefine><IfModule><IfVersion><Location><LocationMatch><Proxy><ProxyMatch><VirtualHost>。這些指令都是配置段的容器。
容器有兩種基本類型。大多數容器是針對各個請求的,包含於其中的指令僅對與該容器匹配的請求起作用,而容器<IfDefine><IfModule><IfVersion>僅在啓動和重新啓動時起作用,如果在啓動時指定的條件成立,則其中的指令對所有的請求都有效,否則將被忽略。
<IfDefine>容器中的指令只有在httpd命令行中設定了特定的參數後纔有效。下面的示例中限定只有在服務器用 httpd -DClosedForNow 方式啓動時,所有的請求才會被重定向到另一個站點:
<IfDefine ClosedForNow>
</IfDefine>
<IfModule>容器與<IfDefine>很相似,但是其中的指令只有當服務器啓用特定的模塊時纔有效(或是被靜態地編譯進了服務器,或是被動態裝載進了服務器)。注意,配置文件中該模塊的裝載指令LoadModule行必須出現在此容器之前。這個容器應該僅用於無論特定模塊是否安裝,配置文件都能正常運轉的場合;而不應該用於容器中的指令在任何情況下都必須生效的場合,因爲它會抑制類似模塊沒找到之類的有用出錯信息。
下面的示例中,指定MimeMagicFiles指令僅當mod_mime_magic模塊啓用時纔有效。
<IfModule mod_mime_magic.c>
MimeMagicFile conf/magic
</IfModule>
<IfVersion>指令與<IfDefine><IfModule>也很相似,但是其中的指令只有當正在執行的服務器版本與指定的版本要求相符時纔有效。這個模塊被設計用於測試套件,以及在一個存在多個不同httpd版本的大型網絡中需要針對不同版本使用不同配置的情況。
<IfVersion >= 2.1>   # 僅在版本高於 2.1.0 的時候才生效
</IfVersion>
<IfDefine><IfModule><IfVersion>都可以在條件前加一個“!”符號以實現條件的否定,而且都可以嵌套以實現更復雜的配置。

2文件系統和網絡空間

最常用的配置段是針對文件系統和網絡空間特定位置的配置段。首先必須理解文件系統和網絡空間這兩個概念的區別:文件系統是指操作系統所看見的磁盤視圖,比如,在UNIX系統中,Apache會被默認安裝到“/usr/local/apache2.2目錄下,在Windows系統中,Apache會被默認安裝到“Program Files/Apache Software Foundation/Apache2.2目錄下。相反,網絡空間是網站被Web服務器發送及被客戶在瀏覽器中所看到的視圖。在Windows平臺下,網絡空間的默認安裝路徑爲“Program Files/Apache Software Foundation/Apache2.2/ htdocs”。由於網頁可以從數據庫或其他地方動態生成,因此,網絡空間無須直接映射到文件系統中。
Apache始終用正斜槓而不是反斜槓作爲路徑的分隔符,即使是在Windows平臺中。
1)文件系統容器
<Directory><Files>指令與其相應的正則表達式版本(<DirectoryMatch><FilesMatch>)一起作用於文件系統的特定部分。<Directory>配置段中的指令作用於指定的文件系統目錄及其所有子目錄,.htaccess文件可以達到同樣的效果。在下面的示例中,/var/web/dir1及其所有子目錄被允許進行目錄索引。
<Directory /var/web/dir1>
Options +Indexes
</Directory>
<Files>配置段中的指令作用於特定的文件名,而無論這個文件實際存在於哪個目錄下。下面的示例中的配置指令如果出現在配置文件的主服務器段,則會拒絕對位於任何目錄下的private.html的訪問。
<Files private.html>
Order allow,deny
Deny from all
</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>
Order allow,deny
Deny from all
</Files>
</Directory>
2)網絡空間容器
<Location>指令與其相應的正則表達式版本(<LocationMatch>)一起作用於網絡空間的特定部分。下面的示例中的配置會拒絕對任何以“/private”開頭的URL路徑的訪問,如http://yoursite.example.com/privatehttp://yoursite.example.com/private123http://yoursite.example.com/private/dir/file.html等所有以“/private”開頭的URL路徑。
<Location /private>
Order Allow,Deny
Deny from all
</Location>
<Location>指令與文件系統無關,下面的示例演示瞭如何將特定的URL映射到Apache內部的處理器mod_status中,而並不要求文件系統中確實存在server-status文件。
<Location /server-status>
SetHandler server-status
</Location>
3)通配符和正則表達式
<Directory><Files><Location>指令可以使用與C標準庫中的fnmatch類似的shell風格的通配符。“*”匹配任何字符串,“?”匹配任何單個的字符,“[seq]”匹配seq序列中的任何字符,“/”符號不被任何通配符所匹配,所以必須顯式地使用。
如果需要更復雜的匹配,這些容器都有一個對應的正則版本<DirectoryMatch><FilesMatch><LocationMatch>,可以使用與Perl兼容的正則表達式,以提供更復雜的匹配。下面的示例使用非正則表達式的通配符來改變所有用戶目錄的配置。
<Directory /home/*/public_html>
Options Indexes
</Directory>
下例是使用正則表達式一次性拒絕對多種圖形文件的訪問。
<FilesMatch /.?i:gif|jpe?g|png$>
Order allow,deny
Deny from all
</FilesMatch>
4)選擇文件系統容器,還是網絡空間容器
選擇使用文件系統容器,還是使用網絡空間容器其實很簡單。當指令作用於文件系統時,總是用<Directory><Files>;而當指令作用於不存在於文件系統中的對象時,就用<Location>,比如一個由數據庫生成的網頁。一定不要試圖用<Location>去限制對文件系統中的對象的訪問,因爲許多不同的網絡空間路徑可能會映射到同一個文件系統目錄,從而導致訪問限制被突破。比如
<Location /dir/>
Order allow,deny
Deny from all
</Location>
上述配置對http://yoursite.example.com/dir/請求的確起作用。但是,設想在一個不區分大小寫的文件系統中,這個訪問限制會被http://yoursite.example.com/DIR/請求輕易突破。而<Directory>指令纔會真正作用於對這個位置的任何形式的請求。但是,有一個例外,就是UNIX文件系統中的符號連接(軟連接),符號連接可以使同一個目錄出現在文件系統中的多個位置。<Directory>指令將不重設路徑名而直接追蹤符號連接,因此,對於安全要求最高的,應該用Options指令禁止對符號連接的追蹤。
同時,也不要認爲使用大小寫敏感的文件系統就無所謂了,因爲有很多方法可以將不同的網絡空間路徑映射到同一個文件系統路徑中,所以,應當儘可能使用文件系統容器。但是也有一個例外,就是把訪問限制放在<Location />配置段中可以很安全地作用於除了某些特定URL以外的所有URL

3.虛擬主機

“虛擬主機”是指在一個機器上運行多個網站(比如,www.company1.comwww.company2.com)。如果每個網站擁有不同的IP地址,則虛擬主機可以是“基於IP”的;如果只有一個IP地址,也可以是“基於主機名”的,其實現對最終用戶是透明的。這一點,其實在介紹IIS網站架設中也有類似的說明,那就是網站的標識,它既可以基於IP地址,也可以基於“主機頭值”(也就是域名),還可以基於端口。
Apache是率先支持基於IP的虛擬主機的服務器之一。1.1及其更新版本同時支持基於IP和基於主機名的虛擬主機。虛擬主機中所用的容器就是<VirtualHost>,它作用於特定的虛擬主機,爲同一個機器上具有不同配置的多個主機提供支持。
有關虛擬主機的配置方法將在本章後面具體介紹。

4.代理

<Proxy><ProxyMatch>容器中的指令僅作用於通過mod_proxy代理服務器訪問的、與指定URL匹配的站點。下面的示例中的配置會拒絕通過代理服務器訪問cnn.com站點。
<Proxy http://cnn.com/*>
Order allow,deny
Deny from all
</Proxy>

5.總結

以上介紹了幾種類型的容器及所用的指令,查閱指令的作用域,就可以知道哪些指令可以出現在哪些配置段中。從語法上看,允許在<Directory>段中使用的指令當然也可以在<DirectoryMatch><Files><FilesMatch><Location><LocationMatch><Proxy><ProxyMatch>段中使用,但也有例外:
AllowOverride指令只能出現在<Directory>段中。
Options(參數選項)中的FollowSymLinksSymLinksIfOwnerMatch只能出現在<Directory>段或者.htaccess文件中。Options指令不能用於<Files><FilesMatch>段。
除了各自的應用範圍不同之外,它們之間有些配置段還是可以合併的。配置段會按非常特別的順序依次生效,由於這會對配置指令的處理結果產生重大影響,因此理解它的流程非常重要。
合併的順序如下。
1<Directory>(除了正則表達式)和.htaccess同時處理(如果允許的話,.htaccess的設置會覆蓋<Directory>的設置);
2<DirectoryMatch>(和<Directory ~>);
3<Files><FilesMatch>同時處理;
4<Location><LocationMatch>同時處理。
除了<Directory>,每個組都按它們在配置文件中出現的順序被依次處理,而<Directory>(上面的第1組),會按順序由短到長被依次處理。例如:<Directory /var/web/dir>會先於<Directory /var/web/dir/subdir>被處理。如果有多個指向同一個目錄的<Directory>段,則按它們在配置文件中的順序被依次處理。用Include指令包含進來的配置被視爲按原樣插入到Include指令的位置。
位於<VirtualHost>容器中的配置段在外部對應的段處理完畢以後再處理,這樣就允許虛擬主機覆蓋主服務器的設置。
當請求是由mod_proxy處理的時候,<Proxy>容器將會在處理順序中取代<Directory>容器的位置。也就是說,後面的段覆蓋前面的相應的段。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章