Apache+php+mysql的安裝與配置 - 之二(Apache的文件目錄配置)

Apache核心(Core)配置

Directory

語法 <Directory directory-path> ... </Directory>
<Directory>和</Directory>用於封裝一組指令,使之僅對某個目錄及其子目錄生效。Directory-path可以是一個目錄的完整路徑,或是包含了Unix shell匹配語法的通配符字符串。在通配符字符串中,"?"匹配任何單個的字符,"*"匹配任何字符序列。您也可以使用"[]"來確定字符範圍。以上通配符都不能匹配"/"字符。
也可以附加"~"字符來表示使用正則表達式。例如:
<Directory ~ "^/www/(.+/)*[0-9]{3}">
將匹配/www/下所有由3個數字組成的目錄。

如果有多個(非正則表達式)<Directory>配置段符合包含某文檔的目錄(或其父目錄),那麼指令將以短目錄優先的規則進行應用。幷包含.htaccess文件中的指令。比如說:
<Directory />
AllowOverride None
</Directory>

<Directory /home/>
AllowOverride FileInfo
</Directory>
中,訪問文檔/home/web/dir/doc.html的步驟如下:
1. 應用指令AllowOverride None(禁用.htaccess文件)。
2. 應用指令AllowOverride FileInfo(針對/home目錄)。
3. 按順序應用所有/home/.htaccess 、/home/web/.htaccess 、/home/web/dir/.htaccess中的FileInfo組指令。
正則表達式將在所有普通配置段之後予以考慮。所有的正則表達式將根據它們出現在配置文件中的順序進行應用。

注意:Apache對<Directory />的默認訪問權限爲"Allow from All"。我們建議您將這個配置做如下屏蔽:
<Directory />
Order Deny,Allow
Deny from All
</Directory>
然後在您想要使之被訪問的目錄中覆蓋此配置。

Location

語法 <Location URL-path|URL> ... </Location>

<Location>提供了基於URL的訪問控制。<Location>配置段的處理位於<Directory>, .htaccess, <Files>之後,並依照在配置文件中出現的順序進行處理。
<Location>配置段完全獨立於文件系統之外來進行操作。
何時使用<Location>?
使用<Location>來將指令應用於獨立於文件系統之外的內容。文件系統之內的內容請使用<Directory>和<Files>指令。不過一個例外是<Location /> ,它可以方便的作用於所用URL。
URL可以用一個通配符字符串來進行通配符的處理。"?"匹配任何單個的字符,而"*"匹配所有字符序列。
也可以附加"~"字符來表示使用正則表達式。例如:
<Location ~ "/(extra|special)/data">
將匹配所有包含字符串"/extra/data"或"/special/data"的URL。

<Location>的功能在與SetHandler指令聯用時能發揮最大效能。比如啓用狀態請求,但僅對來自foo.com的用戶起效,您可以這樣使用:
<Location /status>
SetHandler server-status
Order Deny,Allow
Deny from all
Allow from .foo.com
</Location>

請注意"/"(斜線)
斜線字符根據它在URL中出現的位置不同有着特殊的意義。大家可能都已經習慣在文件系統中,多個連續的斜線會被作爲單一的斜線處理(例如"/home///foo"與"/home/foo"相同)。但在URL裏面,這樣是行不通的。<LocationMatch>指令和正則表達式版本的<Location>要求您明確使用多重斜線。比如:<LocationMatch ^/abc>將匹配請求"/abc"但不會匹配請求"//abc"。而非正則表達式版本的<Location>指令在用於代理請求時,也有類似表現。但當非正則表達式版本的<Location>作用於非代理請求時,它會將多個毗鄰的斜線認作單個斜線。比如,如果您指定了<Location /abc/def>而請求是指向"/abc//def"的,那麼它們就是匹配的。

Files

語法 <Files filename> ... </Files>

<Files>指令提供了基於文件名的訪問控制。
<Files>段將根據它們在配置文件中出現的順序被處理:在<Directory>段和.htaccess文件被處理之後,但在<Location>段之前。
請注意:<Files>能嵌入到<Directory>段中以限制它們作用的文件系統範圍。

filename參數應當是一個文件名或是一個包含通配符的字符串,其中"?"匹配任何單個字符,"*"匹配任何字符串序列。在"~"字符之後同樣可以使用正則表達式。比如:
<Files ~ "\.(gif|jpe?g|png)$">
將匹配絕大部分常見的因特網圖象格式。
請注意與<Directory>和<Location>配置段不同的是:<Files>配置段可用於.htaccess文件當中。這將允許用戶在文件層面上控制對它們自己文件的訪問。


<Directory>、<Location>、<Files>的配合使用

最常用的配置段是針對文件系統和網絡空間特定位置的配置段。首先必須理解文件系統和網絡空間這兩個概念的區別,文件系統是指操作系統所看見的磁盤視圖,比如,在Unix文件系統中,Apache會被默認安裝到/usr/local/apache2 ,在Windows文件系統中,Apache會被默認安裝到"C:/Program Files/Apache Group/Apache2"(注意:Apache始終用正斜槓而不是反斜槓作爲路徑的分隔符,即使是在Windows中)。相反,網絡空間是網站被web服務器發送以及被客戶在瀏覽器中所看到的視圖。所以網絡空間中的路徑/dir/ 在Apache採用默認安裝路徑的情況下對應於Unix文件系統中的路徑/usr/local/apache2/htdocs/dir/ 。由於網頁可以從數據庫或其他地方動態生成,因此,網絡空間無須直接映射到文件系統。

文件系統

<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>


網絡空間

<Location>指令與其相應的正則表達式版本(<LocationMatch>)一起作用於網絡空間的特定部分。

下例中的配置會拒絕對任何以"/private"開頭的URL路徑的訪問,比如:http://yoursite.example.com/private、http://yoursite.example.com/private123、http://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>


通配符和正則表達式

<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>


什麼情況下用什麼?

選擇使用文件系統容器還是使用網絡空間容器其實很簡單。當指令應該作用於文件系統時,總是用<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。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章