Apache中對於目錄設定的項目說明
>> 2010年9月30日 星期四
從網路上蒐集到的,放在這邊,方便自己查詢。
可以參考原始網站,有更完整的說明,這邊只列出常用的項目。
原始網站:http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/mod_authz_host.html
Options Indexes FollowSymLinks
使用directory-path參數的時候要注意:它們必須與Apache用於訪問文件的文件系統路徑保持一致。 賦予特定的指令將無法對通過不同路徑指向的同一個目錄文件生效,比如說通過另外一個符號連接生成的路徑。
擴展的正則表達式也可以通過附加一個"~"字符來使用。 比如說:
將匹配/www/下所有由3個數字組成的目錄。
如果有多個(非正則表達式)配置段符合包含某文檔的目錄(或其父目錄),那麼指令將以短目錄優先的規則進行應用。 並包含.htaccess文件中的指令。 比如說在
AllowOverride None
AllowOverride FileInfo
中,訪問文檔/home/web/dir/doc.html的步驟如下:
應用指令AllowOverride None(禁用.htaccess文件)。
應用指令AllowOverride FileInfo(針對/home目錄)。
按順序應用所有/home/.htaccess 、/home/web/.htaccess 、/home/web/dir/.htaccess中的FileInfo組指令。
正則表達式將在所有普通配置段之後予以考慮。 所有的正則表達式將根據它們出現在配置文件中的順序進行應用。 比如說,以下配置:
# ......
正則表達式配置段將在所有普通的和.htaccess文件應用之後才予以考慮。 所以正則表達式將匹配/home/abc/public_html/abc並予以應用。
請注意:Apache對的默認訪問權限為"Allow from All"。 這意味著Apache將伺服任何通過URL映射的文件。 我們建議您將這個配置做如下屏蔽:
Order Deny,Allow
Deny from All
然後在您想要使之被訪問的目錄中覆蓋此配置。 參閱安全提示以獲取更多詳情。
一般來說指令只會出現在httpd.conf文件中,但它們也可能出現在任何其它配置文件中。指令不可被嵌套使用,也不能出現在或配置段中。
=====================================================================
何時使用?
使用來將指令應用於獨立於文件系統之外的內容。 文件系統之內的內容請使用和指令。 不過一個例外是 ,它可以方便的作用於所用URL。
對所有的原始(非代理)請求來說,匹配的URL應該是具有"/path/"形式的URL路徑。 不包括訪問方法、主機名、端口或查詢字符串等。 對於代理的請求,匹配的URL必須為"scheme://servername/path"的形式,而且必須包括前綴。
URL可以用一個通配符字符串來進行通配符的處理。 "?"匹配任何單個的字符,而"*"匹配所有字符序列。
也可以附加"~"字符來表示使用正則表達式。 例如:
將匹配所有包含字符串"/extra/data"或"/special/data"的URL。 在Apache1.3及其後續版本中,加入了一個新的推薦使用的指令,其功能與的正則表達式版本相同。
SetHandler server-status
Order Deny,Allow
Deny from all
Allow from .foo.com
請注意"/"(斜線)
斜線字符根據它在URL中出現的位置不同有著特殊的意義。 大家可能都已經習慣在文件系統中,多個連續的斜線會被作為單一的斜線處理(例如"/home///foo"與"/home/foo"相同)。 但在URL裡面,這樣是行不通的。指令和正則表達式版本的要求您明確使用多重斜線。 比如:將匹配請求"/abc"但不會匹配請求"//abc"。 而非正則表達式版本的指令在用於代理請求時,也有類似表現。 但當非正則表達式版本的作用於非代理請求時,它會將多個毗鄰的斜線認作單個斜線。 比如,如果您指定了而請求是指向"/abc//def"的,那麼它們就是匹配的。
=============================================================
DocumentRoot 指令
此指令設置了httpd伺服的目錄。 在沒有使用類似Alias這樣的指令的情況下,伺服器會將請求中的URL附加到DocumentRoot後面以構成指向文檔的路徑。 比如說:
DocumentRoot /usr/web
於是對http://www.my.host.com/index.html的訪問就會指向/usr/web/index.html 。 如果directory-path不是絕對路徑,則被假定為是相對於ServerRoot的路徑。
指定DocumentRoot時不應包括最後的"/"。
==============================================================
ErrorDocument 指令
當遇到問題或錯誤的時候,Apache能被配置為進行以下四種處理之一:
1.輸出一個簡單生硬的錯誤代碼信息
2.輸出一個經過定制的信息
3.重定向到一個本地的URL-path來處理這個問題(錯誤)
4.重定向到一個外部的URL來處理這個問題(錯誤)
默認會採取第1種方法,而第2-4種方法可以使用ErrorDocument指令後面跟隨一個HTTP應答代碼和一個URL或信息來進行配置。 Apache有時會額外提供一些信息來描述所發生的問題/錯誤。
URL可以由一個斜杠(/)開頭來指示一個本地URL(相對於DocumentRoot),或是提供一個能被客戶端解釋的完整的URL。 此外還能提供一個可以被瀏覽器顯示的消息。 比如:
ErrorDocument 500 http://foo.example.com/cgi-bin/tester
ErrorDocument 404 /cgi-bin/bad_urls.pl
ErrorDocument 401 /subscription_info.html
ErrorDocument 403 "Sorry can't allow you access today"
另外,特殊的"default"值可以被用來指定使用Apache內置的、簡單的硬編碼消息。 當不需要這個定制特性的時候,可以用"default"恢復Apache內置的、簡單的硬編碼消息,否則將繼承一個已有的ErrorDocument 。
ErrorDocument 404 /cgi-bin/bad_urls.pl
ErrorDocument 404 default
請注意,如果您為ErrorDocument指定了一個外部的URL(比如說,任何在開頭指示了類似"http"這樣的訪問方法的字符串),Apache將會向客戶端發送一個重定向指令來告訴它在哪裡找到這個文檔,哪怕這個文檔最後還是在這個伺服器上。 這裡麵包含著一些暗示:最重要的就是客戶端無法接收到原始的錯誤狀態代碼,取而代之的是一個重定向狀態代碼。 這將會使一些用狀態代碼來判斷一個URL是否有效的web機器人或其它客戶端產生誤解。 另外,如果您在"ErrorDocument 401"中使用了外部URL,客戶端將不會提示用戶輸入密碼,因為它根本沒收到這樣一個401的狀態代碼。 所以,如果您想使用"ErrorDocument 401"指令,就必須指向一個本地的文檔。
Microsoft Internet Explorer (MSIE)在伺服器端產生的錯誤信息"很小"的時候會忽略它們而用自己"友好的"錯誤信息進行取代。 這個大小的閾值根據錯誤類型而不同。 但一般來說,如果您的錯誤信息的大小在512 byte以上,MSIE就會顯示這些伺服器端產生的錯誤文檔而不會屏蔽它們。 您可以在微軟知識庫的文章Q294807中獲取更多信息。
雖然大多數錯誤信息可以被改寫,但是在有些情況下,將仍然使用某些內置的錯誤信息而不管ErrorDocument如何設置。 特別是在檢測到一個"畸形"請求的情況下,正常的請求處理過程將會被立即中斷,並且立即返回一個內置的錯誤信息。 這是為了防止某些不良請求可能導致的安全問題。
在2.0版以前,信息前面會用一個不配對的雙引號作為前導標誌。
=====================================================================
Apache之AllowOverride參數詳解(ref:http://www.systn.com/data/articles/246_tw.html)通常利用Apache的rewrite模組對 URL 進行重寫的時候, rewrite規則會寫在 .htaccess 檔案裡。但要使 apache 能夠正常的讀取.htaccess 檔案的內容,就必須對.htaccess 所在目錄進行配置。從安全性考慮,根目錄的AllowOverride內容一般都配置成不允許任何Override ,即
< Directory />
AllowOverride None
< /Directory>
在 AllowOverride 設定為 None 時, .htaccess 檔案將被完全略過。當此指令設定為 All 時,所有俱有 “.htaccess” 作用域的指令都允許出現在 .htaccess 檔案中。
而對於 URL rewrite 來說,至少需要把目錄設定為
< Directory /myblogroot/>
AllowOverride FileInfo
< /Directory>
AllowOverride的參數:
AuthConfig
允許使用與認證授權相關的指令(AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, Require, 等)。
FileInfo
允許使用控制文檔類型的指令(DefaultType, ErrorDocument, ForceType, LanguagePriority, SetHandler, SetInputFilter, SetOutputFilter, mod_mime中的 Add* 和 Remove* 指令等等)、控制文檔元資料的指令(Header, RequestHeader, SetEnvIf, SetEnvIfNoCase, BrowserMatch, CookieExpires, CookieDomain, CookieStyle, CookieTracking, CookieName)、mod_rewrite中的指令(RewriteEngine, RewriteOptions, RewriteBase, RewriteCond, RewriteRule)和mod_actions中的Action指令。
Indexes
允許使用控制目錄索引的指令(AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName, 等)。
Limit
允許使用控制主機訪問的指令(Allow, Deny, Order)。
Options[=Option,...]
允許使用控制指定目錄功能的指令(Options和XBitHack)。可以在等號後麵附加一個逗號分隔的(無空格的)Options選項清單,用來控制允許Options指令使用哪些選項。
==========================================================
Options 指令
Options指令控制了在特定目錄中將使用哪些伺服器特性。
option可以為None ,在這種情況下,將不啟用任何額外特性。 或設置為以下選項中的一個或多個:
All
除MultiViews之外的所有特性。 這是默認設置。
ExecCGI
允許使用mod_cgi執行CGI腳本。
FollowSymLinks
伺服器允許在此目錄中使用符號連接。
注意:即使伺服器會使用符號連接,但它不會改變用於匹配段的路徑名。
注意:如果此配置位於配置段中,則此設置會被忽略。
Includes
允許使用mod_include提供的伺服器端包含。
IncludesNOEXEC
允許伺服器端包含,但禁用"#exec cmd"和"#exec cgi"。 但仍可以從ScriptAlias目錄使用"#include virtual"虛擬CGI腳本。
Indexes
如果一個映射到目錄的URL被請求,而此目錄中又沒有DirectoryIndex(例如:index.html),那麼伺服器會返回由mod_autoindex生成的一個格式化後的目錄列表。
MultiViews
允許使用mod_negotiation提供內容協商的"多重視圖"(MultiViews)。
SymLinksIfOwnerMatch
伺服器僅在符號連接與其目的目錄或文件的擁有者俱有相同的uid時才使用它。
注意
如果此配置出現在配置段中,此選項將被忽略。
一般來說,如果一個目錄被多次設置了Options ,則最特殊的一個會被完全接受(其它的被忽略),而各個可選項的設定彼此並不融合(參見配置段的合併)。 然而,如果所有作用於Options指令的可選項前都加有"+"或"-"符號,此可選項將被合併。 所有前面加有"+"號的可選項將強制覆蓋當前的可選項設置,而所有前面有"-"號的可選項將強制從當前可選項設置中去除。
比如,沒有任何"+"或"-"符號:
Options Indexes FollowSymLinks
Options Includes
那麼只有將Includes設置到/web/docs/spec目錄上。 然而如果第二個Options指令使用了"+"和"-"符號:
Options Indexes FollowSymLinks
Options +Includes -Indexes
那麼就會有FollowSymLinks和Includes設置到/web/docs/spec目錄上。
注意
使用 -IncludesNOEXEC 或 -Includes 時,不論前面如何設置,都會完全禁用伺服器端包含。
沒有其它設置時,默認設置為 All 。
=====================================================================
Allow 指令
Allow指令控制哪些主機可以訪問伺服器的該區域。 可以根據主機名、IP地址、 IP地址範圍或其他環境變量中捕獲的客戶端請求特性進行控制。
這個指令的第一個參數總是"from",隨後的參數可以有三種不同形式:如果指定"Allow from all",則允許所有主機訪問,按照下述Deny和Order指令的配置。 若要只允許特定的主機或主機群訪問伺服器,host可以用下面任何一種格式來指定:
一個(部分)域名
示例:
Allow from apache.org
Allow from .net example.edu
主機名與給定字符串匹配或者以給定字符串結尾的主機允許訪問。 只有完整的名字組成部分才被匹配,因此上述例子將匹配foo.apache.org但不能匹配fooapache.org 。 這樣的配置將導致Apache不管HostnameLookups指令是如何設置的,對一個對客戶IP地址都要執行兩次DNS查詢:一次正查詢保證IP沒有偽造,一次反查詢保證主機名沒有偽造。 只有兩次查詢的結果都吻合,並且主機名能夠被匹配,訪問才被允許。
完整的IP地址
示例:
Allow from 10.1.2.3
Allow from 192.168.1.104 192.168.1.205
允許擁有這些IP地址的主機進行訪問。
部分IP地址
示例:
Allow from 10.1
Allow from 10 172.20 192.168.2
IP地址的開始1到3個字節,用於子網限制。
網絡/掩碼對
示例:
Allow from 10.1.0.0/255.255.0.0
一個網絡"abcd"和一個掩碼"wxyz",用於更精確的子網限制。
網絡/nnn無類別域間路由規格(CIDR specification)
示例:
Allow from 10.1.0.0/16
同前一種情況相似,除了掩碼由nnn個高位字節構成。
注意以上例子中的後三個匹配完全相同的一組主機。
IPv6地址和IPv6子網可以像下面這樣指定:
Allow from 2001:db8::a00:20ff:fea7:ccea
Allow from 2001:db8::a00:20ff:fea7:ccea/10
Allow指令的第三種參數格式允許對伺服器的訪問由環境變量的一個擴展指定。 指定"Allow from env=env-variable"時,如果環境變量env-variable存在則訪問被允許。 使用由mod_setenvif提供的指令,伺服器用一種基於客戶端請求的彈性方式提供了設置環境變量的能力。 因此,這條指令可以用於允許基於像User-Agent(瀏覽器類型)、Referer或其他HTTP請求頭字段的訪問。
示例:
SetEnvIf User-Agent ^KnockKnock/2\.0 let_me_in
Order Deny,Allow
Deny from all
Allow from env=let_me_in
這種情況下,發送以KnockKnock/2.0開頭的用戶代理標示的瀏覽器將被允許訪問,而所有其他瀏覽器將被禁止訪問。
=======================================================================
Deny 指令
這條指令允許基於主機名、IP地址或者環境變量限制對伺服器的訪問。Deny指令的參數設置和Allow指令完全相同。
======================================================================
Order 指令
Order指令控制默認的訪問狀態與Allow和Deny指令生效的順序。Ordering取值範圍是以下幾種範例之一:
Deny,Allow
Deny指令在Allow指令之前被評估。默認允許所有訪問。 任何不匹配Deny指令或者匹配Allow指令的客戶都被允許訪問。
Allow,Deny
Allow指令在Deny指令之前被評估。默認拒絕所有訪問。 任何不匹配Allow指令或者匹配Deny指令的客戶都將被禁止訪問。
Mutual-failure
只有出現在Allow列表並且不出現在Deny列表中的主機才被允許訪問。 這種順序與"Order Allow,Deny"具有同樣效果,不贊成使用。
關鍵字只能用逗號分隔;它們之間不能有空格。 注意在所有情況下每個Allow和Deny指令語句都將被評估。
在下面的例子中,apache.org域中所有主機都允許訪問,而其他任何主機的訪問都將被拒絕。
Order Deny,Allow
Deny from all
Allow from apache.org
下面例子中,apache.org域中所有主機,除了foo.apache.org子域包含的主機被拒絕以外,其他都允許訪問。 而所有不在apache.org域中的主機都不允許訪問,因為默認狀態是拒絕對伺服器的訪問。
Order Allow,Deny
Allow from apache.org
Deny from foo.apache.org
另一方面,如果上個例子中的Order指令改變為"Deny,Allow",將允許所有主機的訪問。 這是因為,不管配置文件中指令的實際順序如何,"Allow from apache.org"指令會最後被評估到並覆蓋之前的"Deny from foo.apache.org"。 所有不在apache.org域中的主機也允許訪問是因為默認狀態被改變到了允許。
即使沒有伴隨Allow和Deny指令,一個Order指令的存在也會影響到伺服器上某一個部分的訪問,這是由於它對默認訪問狀態的影響。 例如:
Order Allow,Deny
這樣將會禁止所有對/www目錄的訪問,因為默認狀態將被設置為拒絕。
Order指令只在伺服器配置的每個段內部控制訪問指令的處理。 這暗示著,例如,一個在段中出現的Allow或Deny指令總是將會在一個段或者.htaccess文件中出現的Allow或Deny指令之後被評估,而不管Order指令如何設置。 要了解配置段落合併的詳細信息,參見配置段文檔。
=====================================================================
*虛擬主機的IP地址
*虛擬主機IP地址對應的完整域名
*字符"*",僅與"NameVirtualHost *"配合使用以匹配所有的IP地址
*字符串"_default_",與基於IP的虛擬主機聯用以捕獲所有沒有匹配的IP地址
示例
ServerAdmin webmaster@host.foo.com
DocumentRoot /www/docs/host.foo.com
ServerName host.foo.com
ErrorLog logs/host.foo.com-error_log
TransferLog logs/host.foo.com-access_log
IPv6的地址必須放入方括號中指定,否則作為可選項的端口號將無法確定。一個IPv6的示例如下:
ServerAdmin webmaster@host.example.com
DocumentRoot /www/docs/host.example.com
ServerName host.example.com
ErrorLog logs/host.example.com-error_log
TransferLog logs/host.example.com-access_log
每個虛擬主機必須對應不同的IP地址、端口號或是不同的主機名。在第一種情況下,伺服器所在的物理機器必須配置為可以為多個IP地址接受IP包。(在機器沒有多個網絡硬件界面的情況下,如果您的操作系統支持,您可以使用 ifconfig alias 命令來達到這個目的)。
注意
當使用基於IP的虛擬主機時,特殊的名稱"_default_"可以在沒有匹配到其它列出的虛擬主機的情況下作為匹配任何IP地址的默認虛擬主機。在沒有進行"_default_"虛擬主機的設定時,在沒有IP與請求匹配的情況下,將使用"主伺服器"(在所有虛擬主機配置段之外)的配置。但請注意:任何匹配NameVirtualHost指令的IP地址既不會使用"主伺服器"配置,也不會使用"_default_"虛擬主機的配置。參見基於域名的虛擬主機文檔。
您可以指定一個":port"來改變匹配的端口。如果沒有指定,它將沿用主伺服器中離它最近的那個Listen指定的值。您也可以指定":*"來匹配那個地址上的所有端口(當您使用"_default_"時,這是推薦采用的方法)。
安全
參見安全提示文檔以獲得為什麼當您存儲日志文件的目錄對於啟動伺服器以外的用戶來說是可寫的會危及伺服器安全的詳細資料。