mod_mime
mod_mime
mod_mime就是設定某種擴展名的文件用一種應用程序來打開的方式類型,當該擴展名文件被訪問的時候,瀏覽器會自動使用指定應用程序來打開。多用於指定一些客戶端自定義的文件名,以及一些媒體文件打開方式。
Apache模塊 mod_mime
mod_mime
本模塊通過文件的擴展名將不同的"元信息"與文件關聯起來。元信息在文檔的文件名與文檔的MIME類型、語言、字符集、編碼方式之間建立關聯。最終元信息會傳送到伺服器並參與內容協商,這樣最終在考慮用戶指定參數的基礎上,在幾個可能的文件里選擇一個提供服務。關於內容協商的更多信息,請參閱mod_negotiation模塊。
AddCharset, AddEncoding, AddLanguage, AddType指令都可以用於在文件的擴展名與文件的元信息之間建立映射關係。它們分別指明了文檔的字符集、編碼方式、語言、MIME類型(內容類型)。指令TypesConfig用來指定一個文件,它也包含了擴展名到MIME類型的映射關係。
另外,mod_mime還可以定義處理器和過濾器來生成或處理信息。指令AddHandler, AddOutputFilter, AddInputFilter控制了提供文檔的模塊或腳本的運作方式。MultiviewsMatch指令設定mod_negotiation模塊在嘗試Multiview匹配時,如何處理文件擴展名。
當mod_mime模塊在元信息與文件的擴展名之間建立映射以後,core提供了一組指令用來建立某個給定範圍內所有相關文件與特定的元信息之間的關聯。這些指令包括ForceType, SetHandler, SetInputFilter, SetOutputFilter。core的指令會覆蓋任何在mod_mime模塊中定義的文件擴展名映射。
注意,改變一個文件的元信息,不會改變Last-Modified頭的值。因此,以前被緩存的副本可能還會被用戶或代理伺服器使用。如果改變了元信息(語言、內容類型、字符集、編碼方式),需要"觸及"所有相關文件(更新他們的最後修改時間),以保證所有的訪問者都收到正確的內容標題。
文件可以有多個擴展名,這些擴展名的順序一般情況下是無關緊要的。例如:如果文件welcome.html.fr被映射為內容類型是text/html 、語言是法語的話,文件welcome.fr.html將被映射為完全相同的內容。如果一個以上的擴展名映射到同種類型的元信息上,那麼將使用最右邊的那個。比如:.gif的MIME類型是image/gif 、.html的MIME類型是text/html ,那麼welcome.gif.html的MIME類型將是text/html 。
語言和內容編碼會按照積累的方式處理,因為一個文件可以被指定為多種語言或編碼。因此,welcome.html.en.de文件將會按照Content-Language: en, de和Content-Type: text/html發送。
在處理帶多個擴展名的文件並且這些擴展名同時關聯MIME類型和處理器時,要特別小心。這種情況下通常是由與處理器相關的模塊來處理得到的結果。比如,文件擴展名.imap(通過mod_imagemap模塊)與imap-file處理器相關聯,同時,.html文件擴展名的MIME類型是text/html ,那麼文件world.imap.html將同時與imap-file處理器和text/htmlMIME類型相關聯。在處理這種情況的時候,imap-file處理器會被選用,因此,這個文件會被當作由mod_imagemap模塊處理的圖像映射文件。
一個具有特定MIME類型的文件能夠用一種特定的方法進行額外的編碼,以簡化它在網際網路上的傳輸。這通常指的是壓縮,比如gzip ;也可以是加密,例如pgp ;還可以是像UUencoding那樣的編碼,UUencoding是用來在ASCII(文本)格式的文件里,傳輸二進位文件的編碼方式。
HTTP/1.1 RFC第14.11節是這樣解釋的:
實體頭的"Content-Encoding"域是媒體類型的修飾符。如果存在,它的值指明了對實體本身進行額外編碼的方式,以及為了得到"Content-Type"頭所參照的媒體類型而必須採用的解碼機制。"Content-Encoding"主要用來允許一個文件在不破壞它底層媒體類型的基礎上,進行壓縮。
通過使用一種以上的文件擴展名(參見上面關於帶多擴展名的文件一節),可以指定文件是一種特定的類型,還可以同時指定它特定的編碼方式。
例如,有一個文件,它是Microsoft Word文檔,同時為了減小它的大小,它還被壓縮了。如果.doc擴展名表示Microsoft Word文件類型,而.zip擴展名表示pkzip文件編碼方式,那麼文件Resume.doc.zip就會被認出是一個用pkzip壓縮過的Word文檔。
Apache把一個Content-encoding頭和請求的資源一起發送,以便告訴瀏覽器資源編碼的方式。
Content-encoding: pkzip
字符集、語言、編碼方式、內容類型等信息都是用在內容協商(參閱mod_negotiation模塊)處理過程中的。它們決定了當許多包含了不同的字符集、語言、編碼方式、內容類型的文檔都存在時,具體將哪個文檔返回給客戶端。所有由AddCharset, AddEncoding, AddLanguage, AddType指令定義的文件擴展名關聯(還有在MimeMagicFile指令中列出的文件擴展名)都參與了這個選擇過程。使用AddHandler, AddInputFilter, AddOutputFilter指令建立的關聯,可以用MultiviewsMatch指令來決定參與或不參與匹配。
字符集
為了傳遞更深層次的信息,Apache在傳送一個Content-Language頭以指定文檔語言的基礎上,還在隨後的Content-Type頭中指明了具體的字符集,以便更精確地描述這一信息。
Content-Language: en, fr
Content-Type: text/plain; charset=ISO-8859-1
語言的標識是這個語言名字的二字母縮寫。charset是使用的字符集的精確名字。
說明 在給定的文件擴展名與特定的字符集之間建立映射
語法 AddCharset charset extension [extension] ...
作用域 server config, virtual host, directory, .htaccess
覆蓋項 FileInfo
狀態 基本(B)
模塊 mod_mime
AddCharset指令在特定的文件擴展名與特定的字符集之間建立映射。charset是以extension為擴展名的文件的MIME字符集參數。這個映射關係會強制添加在所有現存的映射關係上,並覆蓋所有現存的extension擴展名映射。
示例
AddLanguage ja .ja
AddCharset EUC-JP .euc
AddCharset ISO-2022-JP .jis
AddCharset SHIFT_JIS .sjis
有了以上定義以後,文檔xxxx.ja.jis會被當成是使用字符集ISO-2022-JP的日文文檔(文檔xxxx.jis.ja也一樣)。AddCharset指令除了用於通知客戶端文檔的字符集編碼方式以便正確地翻譯和顯示以外,還用於內容協商(根據用戶的優先選擇信息,從幾個文檔中選擇一個返回給用戶)。
extension參數是大小寫無關的,並且可以帶或不帶前導點。
參見
mod_negotiation
AddDefaultCharset
說明 在文件擴展名與特定的編碼方式之間建立映射關係
語法 AddEncoding MIME-enc extension [extension] ...
作用域 server config, virtual host, directory, .htaccess
覆蓋項 FileInfo
狀態 基本(B)
模塊 mod_mime
AddEncoding指令在文件擴展名與特定的編碼方式之間建立映射關係。指令定義以extension為擴展名的文件是由MIME-enc方式編碼的。這個映射關係會添加在所有有效的映射關係上,並覆蓋所有相同的extension擴展名映射。
示例
AddEncoding x-gzip .gz
AddEncoding x-compress .Z
有了上述定義后,包含.gz擴展名的文件被認為是用x-gzip方式編碼的,而帶.Z擴展名的文件則被認為是用x-compress方式編碼的。
老的客戶端期望x-gzip和x-compress ,然而,按標準來說,它們分別等同於gzip和compress 。Apache在進行編碼方式映射時,會忽略"x-"前綴。當響應需要包含編碼方式時,Apache會使用客戶端請求的格式(例如:x-foo或foo)來應答。如果客戶端沒有指明特定的格式,Apache會使用AddEncoding指令給定的編碼方式。為了簡化這一問題,你應該為這兩個特定的編碼方式始終使用x-gzip和x-compress 。對於像deflate這樣比較新的編碼方式,指定時不要帶"x-"前綴。
extension參數是大小無關的,並且可以帶或不帶前導點。
說明 在文件擴展名與特定的處理器之間建立映射
語法 AddHandler handler-name extension [extension] ...
作用域 server config, virtual host, directory, .htaccess
覆蓋項 FileInfo
狀態 基本(B)
模塊 mod_mime
指定帶extension擴展名的文件應被handler-name處理器來處理。這個映射關係會添加在所有有效的映射關係上,並覆蓋所有相同的extension擴展名映射。例如,為了把擴展名為.cgi的文件作為CGI腳本來處理,應該定義:
AddHandler cgi-script .cgi
一旦將上述定義放在http.conf文件中,所有包含.CGI擴展名的文件,都會被當成是CGI程序。
extension參數是大小無關的,並且可以帶或不帶前導點。
參見
SetHandler
說明 在文件擴展名與特定的輸入過濾器之間建立映射
語法 AddInputFilter filter[;filter...] extension [extension] ...
作用域 server config, virtual host, directory, .htaccess
覆蓋項 FileInfo
狀態 基本(B)
模塊 mod_mime
兼容性 僅在 Apache 2.0.26 及以後的版本中可用
AddInputFilter指令在文件擴展名extension與對伺服器收到的客戶請求進行處理與轉發的輸入過濾器之間建立映射。這是除包括SetInputFilter指令在內的所有過濾器定義指令之外的定義。這個映射會與所有有效的定義合併,並覆蓋所有相同的extension擴展名映射。
如果要指定一個以上的過濾器,它們必須用分號來分隔,並按它們處理文檔的順序來排列。filter與extension參數都是大小無關的,extension可以帶或不帶前導點。
參見
RemoveInputFilter
SetInputFilter
說明 在文件擴展名與特定的語言之間建立映射
語法 AddLanguage MIME-lang extension [extension] ...
作用域 server config, virtual host, directory, .htaccess
覆蓋項 FileInfo
狀態 基本(B)
模塊 mod_mime
AddLanguage指令在文件擴展名與特定的語言之間建立映射。指令定義以extension為擴展名的文件是以MIME-lang語言寫成的。這個映射關係會添加在所有有效的映射關係上,並覆蓋所有相同的extension擴展名映射。
示例
AddEncoding x-compress .Z
AddLanguage en .en
AddLanguage fr .fr
這樣一來,文檔xxxx.en.Z將會被當成是一個壓縮的英文文檔(xxxx.Z.en也一樣)。雖然內容的語言會返回給客戶端,但瀏覽器一般未必會使用這一信息。AddLanguage指令更多的用於內容協商,以決定哪個文檔應當被返回給用戶。
如果同一個擴展名被賦予多個語言,那麼使用最後出現的那個。因此在下列情況中:
AddLanguage en .en
AddLanguage en-gb .en
AddLanguage en-us .en
帶.en擴展名的文檔會被當成是en-us 。
extension參數是大小無關的,並且可以帶或不帶前導點。
參見
mod_negotiation
說明 在文件擴展名與特定的輸出過濾器之間建立映射關係
語法 AddOutputFilter filter[;filter...] extension [extension] ...
作用域 server config, virtual host, directory, .htaccess
覆蓋項 FileInfo
狀態 基本(B)
模塊 mod_mime
兼容性 僅在 Apache 2.0.26 及以後的版本中可用
AddOutputFilter指令在文件擴展名extension與對服務將返回給客戶的信息進行處理的輸出過濾器之間建立映射。這是除包括SetOutputFilter和AddOutputFilterByType指令在內的所有過濾器定義指令之外定義。這個映射會與所有有效的定義合併,並覆蓋所有相同的extension擴展名映射。
例如,下述配置會在處理所有.shtml文件時,進行伺服器端包含,並同時使用mod_deflate模塊壓縮后輸出。
AddOutputFilter INCLUDES;DEFLATE shtml
如果要指定一個以上的過濾器,它們必須用分號來分隔,並按它們處理文檔的順序來排列。filter和extension參數都是大小寫無關的,extension可以帶或不帶前導點。
參見
RemoveOutputFilter
SetOutputFilter
說明 在給定的文件擴展名與特定的內容類型之間建立映射
語法 AddType MIME-type extension [extension] ...
作用域 server config, virtual host, directory, .htaccess
覆蓋項 FileInfo
狀態 基本(B)
模塊 mod_mime
AddType指令在給定的文件擴展名與特定的內容類型之間建立映射關係。MIME-type指明了包含extension擴展名的文件的媒體類型。這個映射關係會添加在所有有效的映射關係上,並覆蓋所有相同的extension擴展名映射。本指令可用來增加沒有在媒體類型文件(參閱TypesConfig指令)中定義的映射關係。
示例
AddType image/gif .gif
推薦使用AddType指令增加新的媒體類型映射關係,而不是改變TypesConfig文件。
extension參數是大小無關的,並且可以帶或不帶前導點。
參見
DefaultType
ForceType
說明 為所有文件設定特定的默認語言
語法 DefaultLanguage MIME-lang
作用域 server config, virtual host, directory, .htaccess
覆蓋項 FileInfo
狀態 基本(B)
模塊 mod_mime
DefaultLanguage指令告訴Apache,當該指令作用域範圍內(例如,所有當前指令封裝範圍內)的文件沒有明確的語言擴展名(例如由AddLanguage指令定義的.fr或.de)時,文件應該被認為是由MIME-lang語言構成的。舉例來說,這就允許在不必對每個文件進行重命名的情況下,把整個目錄中的文件標記為包含荷蘭語內容。注意不同於用擴展名來指定語言,DefaultLanguage指令只能指定一種語言。
如果沒有提供有效的DefaultLanguage指令同時文件也不包含由AddLanguage定義的語言擴展名,那麼該文件將被認為沒有語言屬性。
示例
DefaultLanguage en
參見
mod_negotiation
說明 將path_info當成是文件名的一個組成部分
語法 ModMimeUsePathInfo On|Off
默認值 ModMimeUsePathInfo Off
作用域 directory
狀態 基本(B)
模塊 mod_mime
兼容性 僅在 Apache 2.0.41 及以後的版本中可用
ModMimeUsePathInfo指令用來設定在使用由mod_mime提供的指令時,是否將URL的path_info與文件名結合起來進行處理。默認值為 Off ,也就是說URL的path_info部分被忽略。
當你使用虛擬文件系統的時候,推薦使用本指令。
示例
ModMimeUsePathInfo On
對/bar/foo.shtml這樣的請求來說,"/bar"是一個位置信息,如果ModMimeUsePathInfo指令為 On ,mod_mime會將請求解析成/bar/foo.shtml ,於是象"AddOutputFilter INCLUDES .shtml"這樣的指令就會使用INCLUDES過濾器來處理這個請求。如果沒有設定ModMimeUsePathInfo指令,則不會使用INCLUDES過濾器。
參見
AcceptPathInfo
說明 在使用MultiViews查詢所匹配的文件時要包含的文件類型
語法 MultiviewsMatch Any|NegotiatedOnly|Filters|Handlers [Handlers|Filters]
默認值 MultiviewsMatch NegotiatedOnly
作用域 server config, virtual host, directory, .htaccess
覆蓋項 FileInfo
狀態 基本(B)
模塊 mod_mime
兼容性 僅在 Apache 2.0.26 及以後的版本中可用
MultiviewsMatch指令在實現mod_negotiation模塊的Multiviews功能時,提供了三種不同的處理方法。Multiviews允許對一個文件的請求,可以用任何在基礎請求後面跟上協商擴展名的情況來匹配,例如:index.html可以用index.html.en, index.html.fr, index.html.gz來匹配。
NegotiatedOnly選項規定每個跟在基礎名字後面的擴展名必須關聯到一個在內容協商時已知的mod_mime擴展名,例如:字符集、內容類型、語言、編碼方式。這是一種最嚴格也是副作用最少的實現方法,它是默認的處理方式。
為了包含與處理器和/或過濾器關聯的擴展名,可以設定MultiviewsMatch指令為Handlers或Filters ,也可以兩個都選。如果其它所有因素都相等,則會選擇最小的那個文件來提供服務。例如,在一個500位元組的index.html.cgi文件和一個1000位元組的index.html.pl文件中做選擇時,.cgi文件會勝出。如果.asis文件與asis-handler處理器關聯,對.asis文件的請求就會使用處理器選項指明的處理器。
即使mod_mime不認識的擴展名,你最終也可以通過使用Any選項來使它匹配用戶的請求。Apaceh1.3就是按這個方式處理的,這會導致無法預測的結果,比如匹配了網站管理員從來不希望使用的.old或.bak文件。
例如,下面的配置允許在Multviews查詢中使用處理器和過濾器,但會拒絕未知的文件:
MultiviewsMatch Handlers Filters
參見
Options
mod_negotiation
說明 刪除任何給定的擴展名與內容字符集之間的關聯
語法 RemoveCharset extension [extension] ...
作用域 virtual host, directory, .htaccess
覆蓋項 FileInfo
狀態 基本(B)
模塊 mod_mime
兼容性 僅在 Apache 2.0.24 及以後的版本中可用
RemoveCharset指令刪除任何給定的擴展名與內容字符集之間的關聯。子目錄中的.htaccess文件可以通過這條指令取消從父目錄或伺服器配置文件中繼承過來的擴展名與內容字符集之間的關聯關係。
extension參數是大小無關的,並且可以帶或不帶前導點。
示例
RemoveCharset .html .shtml
說明 刪除任何給定的擴展名與內容編碼方式之間的關聯
語法 RemoveEncoding extension [extension] ...
作用域 virtual host, directory, .htaccess
覆蓋項 FileInfo
狀態 基本(B)
模塊 mod_mime
RemoveEncoding指令刪除任何給定的擴展名與內容編碼方式之間的關聯。子目錄中的.htaccess文件可以通過這條指令取消從父目錄或伺服器配置文件中繼承過來的擴展名與內容編碼方式之間的關聯關係。舉例來說,它可以這樣來使用:
/foo/.htaccess:
AddEncoding x-gzip .gz
AddType text/plain .asc
RemoveEncoding .gz
這樣,foo.gz被認為是用gzip方式編碼的,但foo.gz.asc將被認為是一個未編碼的純文本文件。
注意
RemoveEncoding指令在所有AddEncoding指令之後處理,因此如果在同一個目錄配置里兩者都出現的話,RemoveEncoding指令將會取消後面的AddEncoding指令的作用。
extension參數是大小無關的,並且可以帶或不帶前導點。
說明 刪除任何指定擴展名與處理器之間的關聯
語法 RemoveHandler extension [extension] ...
作用域 virtual host, directory, .htaccess
覆蓋項 FileInfo
狀態 基本(B)
模塊 mod_mime
RemoveHandler指令刪除任何指定的擴展名與處理器之間的關聯。子目錄中的.htaccess文件可以通過這條指令取消從父目錄或伺服器配置文件中繼承過來的擴展名與處理器之間的關聯關係。舉例來說,它可以這樣來使用:
/foo/.htaccess
AddHandler server-parsed .html
/foo/bar/.htaccess
RemoveHandler .html
這樣/foo/bar目錄中的.html文件將被當成普通文件來處理,而不是由parsing處理器(參閱mod_include模塊)來處理。
extension參數是大小無關的,並且可以帶或不帶前導點。
說明 刪除指定擴展名與輸入過濾器之間的關聯
語法 RemoveInputFilter extension [extension] ...
作用域 virtual host, directory, .htaccess
覆蓋項 FileInfo
狀態 基本(B)
模塊 mod_mime
兼容性 僅在 Apache 2.0.26 及以後的版本中可用
RemoveInputFilter指令刪除指定的擴展名與輸入過濾器之間的關聯。子目錄中的.htaccess文件可以通過這條指令取消從父目錄或伺服器配置文件中繼承過來的擴展名與輸入過濾器之間的關聯關係。
extension參數是大小無關的,並且可以帶或不帶前導點。
參見
AddInputFilter
SetInputFilter
說明 刪除指定的擴展名與內容語言之間的關聯
語法 RemoveLanguage extension [extension] ...
作用域 virtual host, directory, .htaccess
覆蓋項 FileInfo
狀態 基本(B)
模塊 mod_mime
兼容性 僅在 Apache 2.0.24 及以後的版本中可用
RemoveLanguage指令刪除指定的擴展名與內容語言之間的關聯。子目錄中的.htaccess文件可以通過這條指令取消從父目錄或伺服器配置文件中繼承過來的擴展名與內容語言之間的關聯關係。
extension參數是大小無關的,並且可以帶或不帶前導點。
說明 刪除指定擴展名與輸出過濾器之間的關聯
語法 RemoveOutputFilter extension [extension] ...
作用域 virtual host, directory, .htaccess
覆蓋項 FileInfo
狀態 基本(B)
模塊 mod_mime
兼容性 僅在 2.0.26 及以後的版本中可用
RemoveOutputFilter指令刪除指定的擴展名與輸出過濾器之間的關聯。子目錄中的.htaccess文件可以通過這條指令取消從父目錄或伺服器配置文件中繼承過來的擴展名與輸出過濾器之間的關聯關係。
extension參數是大小無關的,並且可以帶或不帶前導點。
示例
RemoveOutputFilter shtml
參見
AddOutputFilter
說明 刪除指定擴展名與內容類型之間的關聯
語法 RemoveType extension [extension] ...
作用域 virtual host, directory, .htaccess
覆蓋項 FileInfo
狀態 基本(B)
模塊 mod_mime
RemoveType指令刪除指定的擴展名與內容類型之間的關聯。子目錄中的.htaccess文件可以通過這條指令取消從父目錄或伺服器配置文件中繼承過來的擴展名與內容類型之間的關聯關係。舉例來說,它可以這樣使用:
/foo/.htaccess
RemoveType .cgi
這將刪除/foo/目錄及其所有子目錄下.cgi文件的特定處理方式,從而使這些文件按DefaultType指令設定的默認類型來處理。
注意
RemoveType指令會在所有的AddType指令之後處理,因此,當同一個目錄配置中,同時存在這兩種指令的時候,前面的RemoveType指令將會取消後面的AddType指令的作用。
extension參數是大小無關的,並且可以帶或不帶前導點。
說明 指定mime.types文件的位置
語法 TypesConfig file-path
默認值 TypesConfig conf/mime.types
作用域 server config
狀態 基本(B)
模塊 mod_mime
TypesConfig指令設定MIME類型配置文件的位置。File-path是相對於ServerRoot的路徑。媒體類型配置文件列出了文件擴展名與內容類型的默認映射關係。大多數管理員使用既定的mime.types文件,它關聯了文件擴展名和由IANA註冊的內容類型。最新的列表可以在http://www.iana.org/assignments/media-types/index.html得到。這樣做可以大大簡化httpd.conf文件里的媒體類型定義,在需要時,也可以用AddType指令來更改這些定義。你不應該編輯mime.types文件,因為在伺服器升級的時候,它會被覆蓋。
文件包含類似於AddType指令參數格式的行:
MIME-type [extension] ...
擴展名的大小寫是無關緊要的。空行和以井號(#)打頭的行會被忽略。
請不要要求Apache HTTP伺服器項目組在已發布的mime.types文件中增加新的項,除非(1)它們已經在IANS註冊過了,或者(2)它們被廣泛地使用,並且在多平台上沒有文件擴展名衝突發生。category/x-subtype請求會被自動拒絕,因為任何新的二字母的擴展名很可能會與已經非常擁擠的語言及字符集名字空間衝突。
參見
mod_mime_magic
apache handbook
http://httpd.apache.org/docs/1.3/mod/mod_mime.html
http://doc.linuxpk.com/doc/apache/mod/mod_mime.html