Apache 2.2配置段和容器

 本文出自 「王達博客」 博客,轉載請與做者聯繫!html

做者已受權本博客轉載linux

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

 

3.2.2   Apache 2.2配置段和容器

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

1.配置段和容器的類型

配置段的類型包括在core、mod_version和mod_proxy 3個模塊中,可使用的指令包括:<Directory>、<DirectoryMatch>、<Files>、<FilesMatch>、<IfDefine>、<IfModule>、<IfVersion>、<Location>、<LocationMatch>、<Proxy>、<ProxyMatch>和<VirtualHost>。這些指令都是配置段的容器。
容器有兩種基本類型。大多數容器是針對各個請求的,包含於其中的指令僅對與該容器匹配的請求起做用,而容器<IfDefine>、<IfModule>、<IfVersion>僅在啓動和從新啓動時起做用,若是在啓動時指定的條件成立,則其中的指令對全部的請求都有效,不然將被忽略。
<IfDefine>容器中的指令只有在httpd命令行中設定了特定的參數後纔有效。下面的示例中限定只有在服務器用 httpd -DClosedForNow 方式啓動時,全部的請求才會被重定向到另外一個站點:
<IfDefine ClosedForNow>
Redirect / [url]http://otherserver.example.com/[/url]
</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/apache 2.2」 目錄下,在Windows系統中,Apache會被默認安裝到「Program Files/Apache Software Foundation/Apache 2.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路徑的訪問,如[url]http://yoursite.example.com/private[/url]、[url]http://yoursite.example.com/private123[/url]、[url]http://yoursite.example.[/url] 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>
上述配置對[url]http://yoursite.example.com/dir/[/url]請求的確起做用。可是,設想在一個不區分大小寫的文件系統中,這個訪問限制會被[url]http://yoursite.example.com/DIR/[/url]請求輕易突破。而<Directory>指令纔會真正做用於對這個位置的任何形式的請求。可是,有一個例外,就是UNIX文件系統中的符號鏈接(軟鏈接),符號鏈接可使同一個目錄出如今文件系統中的多個位置。<Directory>指令將不重設路徑名而直接追蹤符號鏈接,所以,對於安全要求最高的,應該用Options指令禁止對符號鏈接的追蹤。
同時,也不要認爲使用大小寫敏感的文件系統就無所謂了,由於有不少方法能夠將不一樣的網絡空間路徑映射到同一個文件系統路徑中,因此,應當儘量使用文件系統容器。可是也有一個例外,就是把訪問限制放在<Location />配置段中能夠很安全地做用於除了某些特定URL之外的全部URL。

3.虛擬主機

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

4.代理

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

5.總結

以上介紹了幾種類型的容器及所用的指令,查閱指令的做用域,就能夠知道哪些指令能夠出如今哪些配置段中。從語法上看,容許在<Directory>段中使用的指令固然也能夠在<DirectoryMatch>、<Files>、<FilesMatch>、<Location>、<LocationMatch>、<Proxy>、<ProxyMatch>段中使用,但也有例外:
AllowOverride指令只能出如今<Directory>段中。
Options(參數選項)中的FollowSymLinks和SymLinksIfOwnerMatch只能出如今<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>容器的位置。也就是說,後面的段覆蓋前面的相應的段。
相關文章
相關標籤/搜索