通常一個Web伺服器可以具有多個名字,客戶浏覽器可以使用所有這些名字或IP位址來通路這台伺服器,但在沒有定義虛拟主機的情況下,伺服器總是以自己的正式名字回應浏覽器。ServerName就定義了Web伺服器自己承認的正式名字,例如一台伺服器名字(在DNS中定義了A類型)為 exmaple.org.cn,同時為了友善記憶還定義了一個别名(CNAME記錄)為www.exmaple.org.cn,那麼Apache自動解析得到的名字就為example.org.cn,這樣不管客戶浏覽器使用哪個名字發送請求,伺服器總是告訴客戶程式自己為 example.org.cn。雖然這一般并不會造成什麼問題,但是考慮到某一天伺服器可能遷移到其他計算機上,而隻想通過更改DNS中的www别名配置就完成遷移任務,是以不想讓客戶在其書簽中使用 Linux 記錄下這個伺服器的位址,就必須使用ServerName來重新指定伺服器的正式名字。
DocumentRoot定義這個伺服器對外釋出的超文本文檔存放的路徑,客戶程式請求的UR L就被映射為這個目錄下的網頁檔案。這個目錄下的子目錄,以及使用符号連接配接指出的檔案和目錄都能被浏覽器通路,隻是要在URL上使用同樣的相對目錄名。
注意,符号連接配接雖然邏輯上位于根文檔目錄之下,但實際上可以位于計算機上的任意目錄中,是以可以使客戶程式能通路那些根文檔目錄之外的目錄,這在增加了靈活性的同時但減少了安全性。Apache在目錄的通路控制中提供了FollowSymLinks選項來打開或關閉支援符号連接配接的特性。
Options FollowSymLinks
AllowOverride None
Apache伺服器可以針對目錄進行文檔的通路控制,然而通路控制可以通過兩種方式來實作,一個是在設定檔案 httpd.conf(或access.conf)中針對每個目錄進行設定,另一個方法是在每個目錄下設定通路控制檔案,通常通路控制檔案名字為. htaccess。雖然使用這兩個方式都能用于控制浏覽器的通路,然而使用配置檔案的方法要求每次改動後重新啟動httpd守護程序,比較不靈活,是以主要用于配置伺服器系統的整體安全控制政策,而使用每個目錄下的.htaccess檔案設定具體目錄的通路控制更為靈活友善。
Directory語句就是用來定義目錄的通路限制的,這裡可以看出它的标準文法,為一個目錄定義通路限制。上例的這個設定是針對系統的根目錄進行的,設定了允許符号連接配接的選項FollowSymLinks ,以及使用AllowOverride None表示不允許這個目錄下的通路控制檔案來改變這裡進行的配置,這也意味着不用檢視這個目錄下的相應通路控制檔案。
由于Apache對一個目錄的通路控制設定是能夠被下一級目錄繼承的,是以對根目錄的設定将影響到它的下級目錄。注意由于 AllowOverride None的設定,使得Apache伺服器不需要檢視根目錄下的通路控制檔案,也不需要檢視以下各級目錄下的通路控制檔案,直至httpd.conf(或 access.conf )中為某個目錄指定了允許Alloworride,即允許檢視通路控制檔案。由于Apache對目錄通路控制是采用的繼承方式,如果從根目錄就允許檢視通路控制檔案,那麼Apache就必須一級一級的檢視通路控制檔案,對系統性能會造成影響。而預設關閉了根目錄的這個特性,就使得Apache從 httpd.conf中具體指定的目錄向下搜尋,減少了搜尋的級數,增加了系統性能。是以對于系統根目錄設定AllowOverride None不但對于系統安全有幫助,也有益于系統性能。
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
這裡定義的是系統對外釋出文檔的目錄的通路設定,設定不同的 AllowOverride選項,以定義配置檔案中的目錄設定和使用者目錄下的安全控制檔案的關系,而Options選項用于定義該目錄的特性。
配置檔案和每個目錄下的通路控制檔案都可以設定通路限制,設定檔案是由管理者設定的,而每個目錄下的通路控制檔案是由目錄的屬主設定的,是以管理者可以規定目錄的屬主是否能覆寫系統在設定檔案中的設定,這就需要使用啊AllowOverride參數進行設定,通常可以設定的值為:
- AllowOverride的設定 對每個目錄通路控制檔案作用的影響
- All 預設值,使通路控制檔案可以覆寫系統配置
- None 伺服器忽略通路控制檔案的設定
- Options 允許通路控制檔案中可以使用Options參數定義目錄的選項
- FileInfo 允許通路控制檔案中可以使用AddType等參數設定
AuthConfig 允許通路控制檔案使用AuthName,AuthType等針對每個使用者的認證機制,這使目錄屬主能用密碼和使用者名來保護目錄 Limit 允許對通路目錄的客戶機的IP位址和名字進行限制
每個目錄具備一定屬性,可以使用Options來控制這個目錄下的一些通路特性設定,以下為常用的特性選項:
Options設定 伺服器特性設定
- All 所有的目錄特性都有效,這是預設狀态
- None 所有的目錄特性都無效
FollowSymLinks 允許使用符号連接配接,這将使浏覽器有可能通路文檔根目錄 (DocumentRoot)之外的文檔 SymLinksIfOwnerMatch 隻有符号連接配接的目的與符号連接配接本身為同一使用者所擁有時,才允許通路,這個設定将增加一些安全性
ExecCGI 允許這個目錄下可以執行CGI程式 Indexes 允許浏覽器可以生成這個目錄下所有檔案的索引,使得在這個目錄下沒有index.html(或其他索引檔案)時,能向浏覽器發送這個目錄下的檔案清單
此外,上例中還使用了Order、Allow、Deny等參數,這是Limit語句中用來根據浏覽器的域名和 IP位址來控制通路的一種方式。其中Order定義處理Allow和Deny的順序,而Allow、Deny則針對名字或IP進行通路控制設定,上例使用 allowfrom all,表示允許所有的客戶機通路這個目錄,而不進行任何限制。
UserDir public_html
當在一台Linux上運作Apache伺服器時,這台計算機上的所有使用者都可以有自己的網頁路徑,形如 http://example.org.cn/~user,使用波浪符号加上使用者名就可以映射到使用者自己的網頁目錄上。映射目錄為使用者個人主目錄下的一個子目錄,其名字就用UseDir這個參數進行定義,預設為public_html。如果不想為正式的使用者提供網頁服務,使用DISABLED作 UserDir的參數即可。
#
# AllowOverride FileInfo AuthConfig Limit
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
#
# Order allow,deny
# Allow from all
#
#
# Order deny,allow
# Deny from all
#
#
這裡可以看到Directory的另一個用法,即可以通過簡單的模式比對方法,針對分布在不同目錄下的子目錄定義通路控制權限。這樣設定就需要Apache伺服器對每個路徑進行額外的處理,是以就會降低伺服器的性能,是以預設情況并沒有打開這種通路限制。
這裡可以看到另外一個語句Limit,Limit語句就是用來針對具體的請求方法來設定通路控制的,其中可以使用GET、POST等各種伺服器支援的請求方法做Limit的參數,來設定對不同請求方法的通路限制。一般可以打開對GET、POST、 HEAD三種請求方法,而屏蔽其他的請求方法,以增加安全性。Limit語句中,可以用Order 、Allow、Deny,Allow和Deny中可以使用比對的方法針對域名和IP進行限制,隻是對于域名是從後向前比對,對于IP位址則從前向後比對。
DirectoryIndex index.html
很多情況下,URL中并沒有指定文檔的名字,而隻是給出了一個目錄名。那麼Apache伺服器就自動傳回這個目錄下由 DirectoryIndex定義的檔案,當然可以指定多個檔案名字,系統會這個目錄下順序搜尋。當所有由DirectoryIndex指定的檔案都不存在時,Apache伺服器可以根據系統設定,生成這個目錄下的所有檔案清單,提供使用者選擇。此時該目錄的通路控制選項中的Indexes選項(Options Indexes )必須打開,以使得伺服器能夠生成目錄清單,否則Apache将拒絕通路。
AccessFileName .htaccess
AccessFileName定義每個目錄下的通路控制檔案的檔案名,預設為.htaccess,可以通過更改這個檔案,來改變不同目錄的通路控制限制。
Order allow,deny
Deny from all
除了可以針對目錄進行通路控制之外,還可以根據檔案來設定通路控制,這就是File語句的任務。使用File 語句,不管檔案處于哪個目錄,隻要名字比對,就必須接受相應的通路控制。這個語句對于系統安全比較重要,例如上例将屏蔽所有的使用者不能通路. htaccess檔案,這樣就避免.htaccess中的關鍵安全資訊不至于被客戶擷取。
預設情況下如果代理伺服器和Apache伺服器協商是否緩存其網頁,Apache給予否定的回答,不希望自己的網頁被代理伺服器緩存。然而這樣就不能有效的利用代理伺服器的優勢,是以可以設定CacheNegotiatieDocs 選項,使得代理伺服器可以對網頁進行緩存。然而即使不設定這個選項,有的代理伺服器(或通過調整設定)也能對網頁進行緩存。
打開這個UseCanonicalName是Web伺服器的标準做法,因為客戶發送的大部分請求都是對本伺服器的引用,這樣伺服器就能使用 ServerName和Port選項的設定内容建構完整的URL,并回應客戶,使浏覽器能得到規範的URL。如果将這個參數設定為Off,那麼 Apache将使用從客戶請求中獲得伺服器的名字和端口值(支援HTTP 1.1的客戶的請求中将會有這些資訊),重新建構URL。
TypeConfig用于設定儲存有不同的MIME類型資料的檔案名,在Linux下預設設定為/usr/local/apache/etc/mime.types。
如果Web伺服器不能決定一個文檔的預設類型,這通常表示文檔使用了非标準的字尾,那麼伺服器就使用 DefaultType定義的MIME類型将文檔發送給客戶浏覽器。這裡的設定為text/plain,這樣設定的問題是,如果伺服器不能判斷出文檔的 MIME,那麼大部分情況下這個文檔為一個二進制文檔,但使用 text/plain格式發送回去,浏覽器将在内部打開它而不會提示儲存。是以建議将這個設定更改為application/octet-stream,這樣浏覽器将提示使用者進行儲存。
MIMEMagicFile /usr/local/apache/etc/magic
除了從檔案的字尾出發來判斷檔案的MIME類型之外,Apache還可以進一步分析檔案的一些特征,來判斷檔案的真實MIME類型。這個功能是由mod_mime_magic 子產品實作的,它需要一個記錄各種MIME類型特征的檔案,以進行分析判斷。上面的設定是一個條件語句,如果載入了這個子產品,就必須指定相應的标志檔案 magic的位置。
通常連接配接時,伺服器僅僅可以得到客戶機的IP位址,如果要想獲得客戶機的主機名,以進行日志記錄和提供給 CGI程式使用,就需要使用這個HostnameLookups 選項,将其設定為On打開DNS反查功能。但是這将使伺服器對每次客戶請求都進行DNS查詢,增加了系統開銷,使得反應變慢,是以預設設定為使用Off關閉此選項。關閉選項之後,伺服器就不會獲得客戶機的主機名,而隻能使用IP位址來記錄客戶。
ErrorLog /var/log/httpd-error.log
LogLevel warn
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent} "" combined
LogFormat "%h %l %u %t "%r" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
#CustomLog /var/log/httpd-access.log common
#CustomLog /var/log/httpd-referer.log referer
#CustomLog /var/log/httpd-agent.log agent
CustomLog /var/log/httpd-access.log combined
這裡定義了系統日志的形式,對于伺服器錯誤記錄, 由ErrorLog、 LogLevel 來定義不同的錯誤日志檔案及其記錄内容。
對于系統的通路日志,預設使用CustomLog參數定義日志的位置,預設使用 combined 參數指定将所有的通路日志放在一個檔案中,然而也可以将不同種類的通路日志放在不同的日志記錄檔案中,這是通過在 CustomLog中指定不同的記錄類型來完成的。common表示普通的對單頁面請求通路記錄,referer表示每個頁面的引用記錄,可以看出一個頁面中包含的請求數,agent表示對客戶機的類型記錄,顯然可以将現有的combined 定義的設定行注釋掉,并使用common、referer和agent作為CustomLog的參數,來為不同種類的日志分别指定日志記錄檔案。
顯然,LogFormat是用于定義不同類型的日志進行記錄時使用的格式, 這裡使用了以%開頭的宏定義,以記錄不同的内容。
如果這些參數指定的檔案使用的是相對路徑,那麼就是相對于ServerRoot的路徑。
一些情況下,例如當客戶請求的網頁并不存在時,伺服器将産生錯誤文檔,預設情況下由于打開了 ServerSignature選項,錯誤文檔的最後一行将包含伺服器的名字、Apache的版本等資訊。有的管理者更傾向于不對外顯示這些資訊,就可以将這個參數設定為Off,或者設定為Email,最後一行将替換為對 ServerAdmin 的Email提示。
Alias /icons/ "/www/icons/"
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
Alias參數用于将URL與伺服器檔案系統中的真實位置進行直接映射,一般的文檔将在DocumentRoot 中進行查詢,然而使用Alias定義的路徑将直接映射到相應目錄下,而不再到DocumentRoot 下面進行查詢。是以Alias可以用來映射一些公用檔案的路徑,例如儲存了各種常用圖示的icons路徑。這樣使得除了使用符号連接配接之外,文檔根目錄(DocumentRoot)外的目錄也可以通過使用了Alias映射,提供給浏覽器通路。
定義好映射的路徑之後,應該需要使用Directory語句設定通路限制。
scrīptAlias /cgi-bin/ "/www/cgi-bin/"
AllowOverride None
Options None
Order allow,deny
Allow from all
scrīptAlias也是用于URL路徑的映射,但與Alias的不同在于,scrīptAlias 是用于映射CGI程式的路徑,這個路徑下的檔案都被定義為CGI程式,通過執行它們來獲得結果,而非由伺服器直接傳回其内容。預設情況下CGI程式使用 cgi-bin目錄作為虛拟路徑。
# Redirect old-URI new-URL
Redirect參數是用來重寫URL的,當浏覽器通路伺服器上的一個已經不存在的資源的時候,伺服器傳回給浏覽器新的URL,告訴浏覽器從該URL中擷取資源。這主要用于原來存在于伺服器上的文檔,改變了位置之後,而又希望能使用老URL能通路到,以保持與以前的URL相容。
IndexOptions FancyIndexing
AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
AddIconByType (TXT,/icons/text.gif) text/*
AddIconByType (IMG,/icons/image2.gif) image/*
AddIconByType (SND,/icons/sound2.gif) audio/*
AddIconByType (VID,/icons/movie.gif) video/*
AddIcon /icons/binary.gif .bin .exe
AddIcon /icons/binhex.gif .hqx
AddIcon /icons/tar.gif .tar
AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
AddIcon /icons/a.gif .ps .ai .eps
AddIcon /icons/layout.gif .html .shtml .htm .pdf
AddIcon /icons/text.gif .txt
AddIcon /icons/c.gif .c
AddIcon /icons/p.gif .pl .py
AddIcon /icons/f.gif .for
AddIcon /icons/dvi.gif .dvi
AddIcon /icons/uuencoded.gif .uu
AddIcon /icons/scrīpt.gif .conf .sh .shar .csh .ksh .tcl
AddIcon /icons/tex.gif .tex
AddIcon /icons/bomb.gif core
AddIcon /icons/back.gif ..
AddIcon /icons/hand.right.gif README
AddIcon /icons/folder.gif ^^DIRECTORY^^
AddIcon /icons/blank.gif ^^BLANKICON^^
DefaultIcon /icons/unknown.gif
#AddDescrīption "GZIP compressed document" .gz
#AddDescrīption "tar archive" .tar
#AddDescrīption "GZIP compressed tar archive" .tgz
ReadmeName README
HeaderName HEADER
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
當一個HTTP請求的URL為一個目錄的時候,伺服器傳回這個目錄中的索引檔案。但如果一個目錄中不存在預設的索引檔案,并且該伺服器又許可顯示目錄檔案清單的時候,就會顯示出這個目錄中的檔案清單,為了使得這個檔案清單能具有可了解性,而不僅僅是一個簡單的清單,就需要前面的這些設定參數。
如果使用了IndexOptions FancyIndexing選項,可以讓伺服器産生的目錄清單中針對各種不同類型的文檔引用各種圖示。而哪種檔案使用哪種圖示,則使用下面的 AddIconByEncoding、AddIconByType以及AddIcon來定義,分别依據MIME 的編碼、類型以及檔案的字尾來判斷使用何種圖示。如果不能确定文檔使用的圖示,就使用 DefaultIcon定義的預設圖示。
同樣,使用AddDescrīption可以為不同類型的文檔加入不同的描述。并且,伺服器還在目錄下,查詢使用ReadmeName和 HeaderName定義的檔案(自動加上 .html字尾,如果沒有發現,再使用.txt字尾進行搜尋),如果發現了這些檔案,就在檔案清單之前首先顯示這些檔案的内容,以使得普通目錄清單具備更大的可了解性。
IndexIgnore讓伺服器在列出檔案清單時忽略相應的檔案, 這裡使用模式配置的方式定義檔案名。
AddEncoding x-compress Z
AddEncoding x-gzip gz
AddEncoding用于告訴一些使用壓縮的MIME類型,這樣可以讓浏覽器進行解壓縮操作。
AddLanguage en .en
AddLanguage fr .fr
AddLanguage de .de
AddLanguage da .da
AddLanguage el .el
版權聲明:本文為CSDN部落客「weixin_34195142」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。
原文連結:https://blog.csdn.net/weixin_34195142/article/details/92041660