Apache模块 mod_mime
说明 | 根据文件扩展名决定应答的行为(处理器/过滤器)和内容(MIME类型/语言/字符集/编码) |
---|---|
状态 | 基本(B) |
模块名 | mime_module |
源文件 | mod_mime.c |
概述
本模块通过文件的扩展名将不同的"元信息"与文件关联起来。元信息在文档的文件名与文档的MIME类型、语言、字符集、编码方式之间建立关联。最终元信息会传送到服务器并参与内容协商,这样最终在考虑用户指定参数的基础上,在几个可能的文件里选择一个提供服务。关于内容协商的更多信息,请参阅mod_negotiation
模块。
AddCharset
, AddEncoding
, AddLanguage
, AddType
指令都可以用于在文件的扩展名与文件的元信息之间建立映射关系。它们分别指明了文档的字符集、编码方式、语言、MIME类型(内容类型)。指令TypesConfig
用来指定一个文件,它也包含了扩展名到MIME类型的映射关系。
另外,mod_mime
还可以定义处理器和过滤器来生成或处理信息。指令AddHandler
, AddOutputFilter
, AddInputFilter
控制了提供文档的模块或脚本的运作方式。MultiviewsMatch
指令设定mod_negotiation
模块在尝试Multiview匹配时,如何处理文件扩展名。
当mod_mime
模块在元信息与文件的扩展名之间建立映射以后,core
提供了一组指令用来建立某个给定范围内(也就是<Location>
, <Directory>
, <Files>
)所有相关文件与特定的元信息之间的关联。这些指令包括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/html
MIME类型相关联。在处理这种情况的时候,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
字符集和语言
除了文件类型和文件编码方式外,还有一个重要的信息是文件的语言以及文件显示时的字符集。例如一个文档可能是用越南语或古斯拉夫语写的,并且也应该显示成这种语言。这样的信息也要在HTTP头里进行传输。
字符集、语言、编码方式、内容类型等信息都是用在内容协商(参阅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 指令
说明 | 在给定的文件扩展名与特定的字符集之间建立映射 |
---|---|
语法 | 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 指令
说明 | 在文件扩展名与特定的编码方式之间建立映射关系 |
---|---|
语法 | 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 指令
说明 | 在文件扩展名与特定的处理器之间建立映射 |
---|---|
语法 | 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 指令
说明 | 在文件扩展名与特定的输入过滤器之间建立映射 |
---|---|
语法 | 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 指令
说明 | 在文件扩展名与特定的语言之间建立映射 |
---|---|
语法 | 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 指令
说明 | 在文件扩展名与特定的输出过滤器之间建立映射关系 |
---|---|
语法 | 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 指令
说明 | 在给定的文件扩展名与特定的内容类型之间建立映射 |
---|---|
语法 | 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 指令
说明 | 为所有文件设定特定的默认语言 |
---|---|
语法 | DefaultLanguage MIME-lang |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | FileInfo |
状态 | 基本(B) |
模块 | mod_mime |
DefaultLanguage
指令告诉Apache,当该指令作用域范围内(例如,所有当前<Directory>
指令封装范围内)的文件没有明确的语言扩展名(例如由AddLanguage
指令定义的.fr
或.de
)时,文件应该被认为是由MIME-lang语言构成的。举例来说,这就允许在不必对每个文件进行重命名的情况下,把整个目录中的文件标记为包含荷兰语内容。注意不同于用扩展名来指定语言,DefaultLanguage
指令只能指定一种语言。
如果没有提供有效的DefaultLanguage
指令同时文件也不包含由AddLanguage
定义的语言扩展名,那么该文件将被认为没有语言属性。
示例
DefaultLanguage en
参见
mod_negotiation
ModMimeUsePathInfo 指令
说明 | 将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
MultiviewsMatch 指令
说明 | 在使用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 指令
说明 | 删除任何给定的扩展名与内容字符集之间的关联 |
---|---|
语法 | RemoveCharset extension [extension] ... |
作用域 | virtual host, directory, .htaccess |
覆盖项 | FileInfo |
状态 | 基本(B) |
模块 | mod_mime |
兼容性 | 仅在 Apache 2.0.24 及以后的版本中可用 |
RemoveCharset
指令删除任何给定的扩展名与内容字符集之间的关联。子目录中的.htaccess
文件可以通过这条指令取消从父目录或服务器配置文件中继承过来的扩展名与内容字符集之间的关联关系。
extension参数是大小无关的,并且可以带或不带前导点。
示例
RemoveCharset .html .shtml
RemoveEncoding 指令
说明 | 删除任何给定的扩展名与内容编码方式之间的关联 |
---|---|
语法 | RemoveEncoding extension [extension] ... |
作用域 | virtual host, directory, .htaccess |
覆盖项 | FileInfo |
状态 | 基本(B) |
模块 | mod_mime |
RemoveEncoding
指令删除任何给定的扩展名与内容编码方式之间的关联。子目录中的.htaccess
文件可以通过这条指令取消从父目录或服务器配置文件中继承过来的扩展名与内容编码方式之间的关联关系。举例来说,它可以这样来使用:
/foo/.htaccess:
AddEncoding x-gzip .gz
AddType text/plain .asc
<Files *.gz.asc>
RemoveEncoding .gz
</Files>
这样,foo.gz
被认为是用gzip方式编码的,但foo.gz.asc
将被认为是一个未编码的纯文本文件。
注意
RemoveEncoding
指令在所有AddEncoding
指令之后处理,因此如果在同一个目录配置里两者都出现的话,RemoveEncoding
指令将会取消后面的AddEncoding
指令的作用。
extension参数是大小无关的,并且可以带或不带前导点。
RemoveHandler 指令
说明 | 删除任何指定扩展名与处理器之间的关联 |
---|---|
语法 | 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 指令
说明 | 删除指定扩展名与输入过滤器之间的关联 |
---|---|
语法 | RemoveInputFilter extension [extension] ... |
作用域 | virtual host, directory, .htaccess |
覆盖项 | FileInfo |
状态 | 基本(B) |
模块 | mod_mime |
兼容性 | 仅在 Apache 2.0.26 及以后的版本中可用 |
RemoveInputFilter
指令删除指定的扩展名与输入过滤器之间的关联。子目录中的.htaccess
文件可以通过这条指令取消从父目录或服务器配置文件中继承过来的扩展名与输入过滤器之间的关联关系。
extension参数是大小无关的,并且可以带或不带前导点。
参见
AddInputFilter
SetInputFilter
RemoveLanguage 指令
说明 | 删除指定的扩展名与内容语言之间的关联 |
---|---|
语法 | RemoveLanguage extension [extension] ... |
作用域 | virtual host, directory, .htaccess |
覆盖项 | FileInfo |
状态 | 基本(B) |
模块 | mod_mime |
兼容性 | 仅在 Apache 2.0.24 及以后的版本中可用 |
RemoveLanguage
指令删除指定的扩展名与内容语言之间的关联。子目录中的.htaccess
文件可以通过这条指令取消从父目录或服务器配置文件中继承过来的扩展名与内容语言之间的关联关系。
extension参数是大小无关的,并且可以带或不带前导点。
RemoveOutputFilter 指令
说明 | 删除指定扩展名与输出过滤器之间的关联 |
---|---|
语法 | RemoveOutputFilter extension [extension] ... |
作用域 | virtual host, directory, .htaccess |
覆盖项 | FileInfo |
状态 | 基本(B) |
模块 | mod_mime |
兼容性 | 仅在 2.0.26 及以后的版本中可用 |
RemoveOutputFilter
指令删除指定的扩展名与输出过滤器之间的关联。子目录中的.htaccess
文件可以通过这条指令取消从父目录或服务器配置文件中继承过来的扩展名与输出过滤器之间的关联关系。
extension参数是大小无关的,并且可以带或不带前导点。
示例
RemoveOutputFilter shtml
参见
AddOutputFilter
RemoveType 指令
说明 | 删除指定扩展名与内容类型之间的关联 |
---|---|
语法 | 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参数是大小无关的,并且可以带或不带前导点。
TypesConfig 指令
说明 | 指定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] ...
扩展名的大小写是无关紧要的。空行和以井号(#
)打头的行会被忽略。
mime.types
文件中增加新的项,除非(1)它们已经在IANS注册过了,或者(2)它们被广泛地使用,并且在多平台上没有文件扩展名冲突发生。category/x-subtype
请求会被自动拒绝,因为任何新的二字母的扩展名很可能会与已经非常拥挤的语言及字符集命名空间冲突。
参见
mod_mime_magic