Apache 2.0手册中文版翻译项目 [本文译者: Daniel * ]

项目说明 | 项目进度 | 项目讨论区 | Apache手册中文版

 


mod_mime - Apache HTTP服务器
<-
Apache主站 > HTTP服务器 > 文档 > 2.0版本 > 模块索引

Apache模块 mod_mime

说明:将请求文件的文件扩展名与文件的处理(处理器、过滤器)及内容(mime类型,语言,字符集和编码方式)关联起来。
状态:Base
模块名:mime_module
源文件:mod_mime.c

概要

本模块通过文件的扩展名将不同的"元信息"与文件关联起来。元信息在文档的文件名与它的MIME类型、语言、字符集和编码方式之间建立联系。最终元信息会传送到浏览器(译注:应该是送到服务器参与内容协商吧),并参与文档处理的内容协商,这样最终在考虑用户指定参数的基础上,在几个可能的文件里选择一个提供服务。关于内容协商的更多信息,请参阅mod_negotiation 模块。

指令AddCharset, AddEncoding, AddLanguageAddType都是用来在文件的扩展名与文件的元信息之间建立映射关系的。 它们分别指明了文档的字符集,编码方式,语言和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标题的值。因此,以前被缓冲的复本可能还会被用户或代理服务器使用。如果你改变了元信息(语言,内容类型,字符集或编码方式),你需要'touch'所有相关的文件(更新他们最后修改的时间),来保证所有的访问者都收到正确的内容标题。

指令索引

主题

参见

top

带多扩展名的文件

文件可以有一个以上的扩展名,这些扩展名的顺序一般情况下是无关紧要的。例如:如果文件welcome.html.fr被映射为内容类型是text/html,语言是法语的话,文件welcome.fr.html将被映射为完全相同的内容。如果一个以上的扩展名映射到同种类型的元信息上,那么将使用最右边的那个。例如,.gif的MIME类型是image/gif,而.html的MIME类型是text/html,那么文件welcome.gif.html的MIME类型是text/html

在处理带多个扩展名的文件,并且这些扩展名同时相关MIME类型和模块处理器时,要特别小心。这种情况通常是由与处理器相关的模块来处理得到结果。例如:如果文件扩展名.imap(通过mod_imap 模块)与imap-file处理器相关联,同时,.html文件扩展名的MIME类型是text/html,那么文件world.imap.html将同时与.imap处理器和text/htmlMIME类型相关联。在处理这种情况的时候,imap-file处理器会被选用,因此,这个文件会被当作由模块mod_imap 模块处理的图像映射文件。

top

内容编码

一个具有特定MIME类型的文件能够用一种特定的方法进行额外的编码,以便简化它在互联网上的传输。这通常指的是压缩,比如gzip,它也可以是加密,例如pgp或是象UUencoding那样的编码,UUencoding是用来在ASCII(文本)格式的文件里,传输二进制的文件的编码方式。

HTTP/1.1 RFC,第14.11节是这样来解释的:

实体标题的内容编码域是媒体类型的修饰符。如果存在,它的值指明了对实体的本身进行额外编码的方式,以及为了得到内容类型标题域所参照的媒体类型,而必须采用的解码机制。内容编码主要用来允许一个文件在不破坏它底层媒体类型的基础上,进行压缩。

通过使用一种以上的文件扩展名(参见上面关于带多扩展名的文件一节),你可以指定文件是一种特定的类型,还可以同时指定它的特定的编码方式

例如,你有一个文件,它是Microsoft Word文档,同时为了减小它的大小,它还被压缩了。如果.doc扩展名表示Microsoft Word文件类型,而.zip扩展名表示pkzip文件编码方式,那么文件Resume.doc.zip就会被认出是一个用pkzip压缩过的Word文档。

Apache把一个内容编码标题和请求的资源一起发送,以便告诉客户端浏览器资源编码的方式。

Content-encoding: pkzip

top

字符集和语言

除了文件类型和文件编码方式外,还有一个重要的信息是文件的语言以及文件显示时的字符集。例如一个文档可能是用越南语或古斯拉夫语写的,并且也应该显示成这种语言。这样的信息也要在HTTP请求头里进行传输。

字符集、语言、编码方式及内容类型等信息都是用在内容协商(参阅mod_negotiation 模块)处理过程中的。它们决定了当许多包含了不同的字符集、语言、编码方式或内容类型的文档都存在时,具体哪个文档用来返回给客户。所有由AddCharset, AddEncoding, AddLanguageAddType 指令定义的文件扩展名关联(还有在MimeMagicFile 指令中列示的文件扩展名)都参与了这个选择的过程。使用AddHandler, AddInputFilterAddOutputFilter 指令建立的关联,可以用MultiviewsMatch 指令来决定参与或不参与匹配的过程。

字符集

为传递更深层次的信息,Apache在传送一个Content-Language标题以指定文档所用的语言的基础上,还在随后的Content-Type标题中指明了具体的字符集,以便更精确地描述这一信息。

Content-Language: en, fr
Content-Type: text/plain; charset=ISO-8859-1

语言的标识是这个语言名字的二字母缩写。字符集的标识是使用的字符集的精确名字。

top

AddCharset 指令

说明:在给定的文件扩展名与内容字符集之间建立映射
语法:AddCharset charset extension [extension] ...
上下文:服务器配置, 虚拟主机, 目录, .htaccess
覆盖项:FileInfo
状态:Base
模块:mod_mime

AddCharset 指令为给定的文件扩展名与特定的内容字符集建立映射。指令定义包含extension扩展名的文件是采用charset字符集的。这个映射关系会添加在所有有效的映射关系上,并覆盖所有相同的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 参数是大小无关的,并且可以带也可以不带先导的点。

参见

top

AddEncoding 指令

说明:在文件扩展名与特定的编码方式间建立映射关系
语法:AddEncoding MIME-enc extension [extension] ...
上下文:服务器配置, 虚拟主机, 目录, .htaccess
覆盖项:FileInfo
状态:Base
模块:mod_mime

AddEncoding 指令在文件扩展名与特定的编码方式间建立映射关系。指令定义以extension为扩展名的文件是由MIME-enc方式编码的。这个映射关系会添加在所有有效的映射关系上,并覆盖所有相同的extension扩展名映射。

示例

AddEncoding x-gzip .gz
AddEncoding x-compress .Z

有了以上定义以后,包含.gz扩展名的文件被认为是用x-gzip方式编码的,而带.Z扩展名的文件被认为是用x-compress方式编码的。

老的客户端期望x-gzipx-compress,然而,按标准来说,它们分别等同于gzipcompress。Apache在进行编码方式映射时,会忽略x-前缀。当响应需要包含编码方式时,Apache会使用客户端请求的格式(例如:x-foofoo)来应答。如果客户端没有指明特定的格式,Apache会使用AddEncoding 指令给定时的格式。为了简化这一问题,你应该为这两个特定的编码方式始终使用x-gzipx-compress。对于象deflate这样的比较新的编码方式,指定的时候不要带x-前缀。

extension 参数是大小无关的,并且可以带也可以不带先导的点。

top

AddHandler 指令

说明:在文件扩展名与特定的处理器间建立映射
语法:AddHandler handler-name extension [extension] ...
上下文:服务器配置, 虚拟主机, 目录, .htaccess
覆盖项:FileInfo
状态:Base
模块:mod_mime

指定带extension扩展名的文件应被handler-name处理器 来处理。这个映射关系会添加在所有有效的映射关系上,并覆盖所有相同的extension扩展名映射。例如:为了把扩展名为.cgi的文件作为CGI脚本来处理,你应该定义:

AddHandler cgi-script .cgi

一旦以上的定义放在你的http.conf文件中,所有包含.cgi扩展名的文件,都会被当成是CGI程序。

extension 参数是大小无关的,并且可以带也可以不带先导的点。

参见

top

AddInputFilter 指令

说明:在文件扩展名与处理客户请求的输入过滤器间建立映射
语法:AddInputFilter filter[;filter...] extension [extension] ...
上下文:服务器配置, 虚拟主机, 目录, .htaccess
覆盖项:FileInfo
状态:Base
模块:mod_mime
兼容性:AddInputFilter只在Apache 2.0.26及以后的版本中存在。

AddInputFilter 指令在文件扩展名extension与对服务器收到的客户请求进行处理与转发的输入过滤器间建立映射。这是除包括SetInputFilter 指令在内,所有过滤器定义指令之外定义。这个映射会与所有有效的定义合并,并覆盖所有相同的extension扩展名映射。

如果要指定一个以上的过滤器,它们必须用分号来分隔,并按它们处理文档的顺序来排列。filterextension参数都是大小无关的,extension可以带也可以不带先导的点。

top

AddLanguage 指令

说明:在文件扩展名与特定的内容语言间建立映射
语法:AddLanguage MIME-lang extension [extension] ...
上下文:服务器配置, 虚拟主机, 目录, .htaccess
覆盖项:FileInfo
状态:Base
模块: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-uk .en
AddLanguage en-us .en

.en扩展名的文档会被当成是en-us

extension 参数是大小无关的,并且可以带也可以不带先导的点。

参见

top

AddOutputFilter 指令

说明:在文件扩展名与处理从服务端返回信息的输出过滤器间建立映射关系
语法:AddOutputFilter filter[;filter...] extension [extension] ...
上下文:服务器配置, 虚拟主机, 目录, .htaccess
覆盖项:FileInfo
状态:Base
模块:mod_mime
兼容性:AddOutputFilter只在Apache 2.0.26及以后的版本中存在

AddOutputFilter 指令在文件扩展名extension与对服务将返回给客户的信息进行处理的输出过滤器间建立映射。这是除包括SetOutputFilterAddOutputFilterByType指令在内,所有过滤器定义指令之外定义。这个映射会与所有有效的定义合并,并覆盖所有相同的extension扩展名映射。

例如,下列的配置会在处理所有的.shtml文件时,进行服务器端包含,并同时使用mod_deflate模块压缩后输出。

AddOutputFilter INCLUDES;DEFLATE shtml

如果要指定一个以上的过滤器,它们必须用分号来分隔,并按它们处理文档的顺序来排列。filterextension参数都是大小写无关的,extension可以带也可以不带先导的点。

参见

top

AddType 指令

说明:在给定的文件扩展名与特定的内容类型间建立映射
语法:AddType MIME-type extension [extension] ...
上下文:服务器配置, 虚拟主机, 目录, .htaccess
覆盖项:FileInfo
状态:Base
模块:mod_mime

AddType 指令在给定的文件扩展名与特定的内容类型间建立映射关系。MIME-type指明了包含extension扩展名的文件的媒体类型。这个映射关系会添加在所有有效的映射关系上,并覆盖所有相同的extension扩展名映射。本指令可用来增加没有在媒体类型文件(参阅TypesConfig 指令)中定义的映射关系。

示例

AddType image/gif .gif

推荐使用AddType 指令增加新的媒体类型映射关系,而不是改变TypesConfig 文件。

extension 参数是大小写无关的,并且可以带也可以不带先导的点。

参见

top

DefaultLanguage 指令

说明:为所有指令作用域范围内的文件设定某一特定的缺省语言
语法:DefaultLanguage MIME-lang
上下文:服务器配置, 虚拟主机, 目录, .htaccess
覆盖项:FileInfo
状态:Base
模块:mod_mime

DefaultLanguage 指令告诉Apache,当指令作用域范围(例如,所有当前<Directory> 指令封装范围内的所有文件)的文件没有明确的语言扩展名(例如由AddLanguage 指令定义的.fr.de)时,文件应该被认为是由MIME-lang语言构成的。举例来说,这就允许在不必对每个文件进行重命名的情况下,把整个目录中的文件标记为包含荷兰语内容。注意不同于用扩展名来指定语言,DefaultLanguage 指令只能指定一种语言。

如果没有提供有效的DefaultLanguage 指令,同时文件也不包含由AddLanguage 指令定义的语言扩展名,那么这个文件被认为是没有语言属性的。

例如

DefaultLanguage en

参见

top

ModMimeUsePathInfo 指令

说明:指定mod_mime将path_info当成是文件名的一个组成部分
语法:ModMimeUsePathInfo On|Off
默认值:ModMimeUsePathInfo Off
上下文:目录
状态:Base
模块:mod_mime
兼容性:只在Apache 2.0.41及更新的版本中存在。

ModMimeUsePathInfo 指令用来设定调用mod_mime的指令时,是否将URL的路径信息与文件名结合起来进行处理。缺省值为Off,也就是说URL的path_info部分被忽略。

当你使用虚拟文件系统的时候,推荐使用本指令。

例如

ModMimeUsePathInfo On

/bar/foo.shtml这样的请求来说,/bar是一个位置信息,如果ModMimeUsePathInfo 指令为Onmod_mime会将请求解析成/bar/foo.shtml,那么象AddOuptputFilter INCLUDES .shtml 这样的指令会使用INCLUDES过滤器来对这个请求进行处理。如果ModMimeUsePathInfo 指令没有设定,那么就不会使用INCLUDES过滤器。

参见

top

MultiviewsMatch 指令

说明:在使用MultiViews查询所匹配的文件时所包含的文件类型
语法:MultiviewsMatch Any|NegotiatedOnly|Filters|Handlers [Handlers|Filters]
默认值:MultiviewsMatch NegotiatedOnly
上下文:服务器配置, 虚拟主机, 目录, .htaccess
覆盖项:FileInfo
状态:Base
模块:mod_mime
兼容性:只在Apache 2.0.26及更新的版本中存在。

MultiviewsMatch 指令在实现mod_negotiation 模块的Multiviews功能时,提供三种不同的处理方法。Multiviews允许对一个文件的请求,可以用任何在基础请求后面跟上协商扩展名的情况来匹配,例如:index.html,可以用index.html.enindex.html.frindex.html.gz来匹配。

NegotiatedOnly 选项规定每个跟在基础名字后面的扩展名必须关联到一个在内容协商时已知的mod_mime扩展名,例如:字符集,内容类型,语言或编码方式。这是一种最严格也是副作用最少的实现方法,它是缺省的处理方式。

为了包含与处理器和/或过滤器关联的扩展名,可以设定MultiviewsMatch 指令为HandlersFilters,也可以两个都选。如果其它所有的因素都相等,会选中最小的那个文件来提供服务。例如:在一个500字节的index.html.cgi文件和一个1000字节的index.html.pl文件中做选择时,.cgi文件会胜出。如果.asis文件与asis-handler处理器关联,对.asis文件的请求就会使用到处理器选项指明的处理器。

即使mod_mime不认识的扩展名,你最终也可以通过使用Any选项来使它匹配用户的请求。Apaceh 1.3就是按这个方式处理的,这会导致无法预测的结果,比如匹配了网站管理员从来不希望使用的.old或.bak文件。

例如,下面的配置允许在Multviews查询中使用处理器和过滤器,但会拒绝未知的文件:

MultiviewsMatch Handlers Filters

参见

top

RemoveCharset 指令

说明:删除任何给定的扩展名与内容字符集之间的关联
语法:RemoveCharset extension [extension] ...
上下文:虚拟主机, 目录, .htaccess
覆盖项:FileInfo
状态:Base
模块:mod_mime
兼容性:RemoveCharset只在Apache 2.0.24及更新的版本中存在。

RemoveCharset 指令删除任何给定的扩展名与内容字符集之间的关联。子目录中的.htaccess文件可以通过这条指令取消从父目录或服务器配置文件中继承过来的扩展名与内容字符集之间的关联关系。

extension 参数是大小写无关的,并且可以带也可以不带先导的点。

示例

RemoveCharset .html .shtml

top

RemoveEncoding 指令

说明:删除任何给定的扩展名与内容编码方式间的关联
语法:RemoveEncoding extension [extension] ...
上下文:虚拟主机, 目录, .htaccess
覆盖项:FileInfo
状态:Base
模块: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 参数是大小写无关的,并且可以带也可以不带先导的点。

top

RemoveHandler 指令

说明:删除任何指定扩展名与处理器间的关联
语法:RemoveHandler extension [extension] ...
上下文:虚拟主机, 目录, .htaccess
覆盖项:FileInfo
状态:Base
模块:mod_mime

RemoveHandler 指令删除任何指定的扩展名与处理器间的关联。子目录中的.htaccess文件可以通过这条指令取消从父目录或服务器配置文件中继承过来的扩展名与处理器之间的关联关系。举例来说,它可以这样来使用:

/foo/.htaccess:

AddHandler server-parsed .html

/foo/bar/.htaccess:

RemoveHandler .html

这样/foo/bar目录中的.html文件将被当成普通文件来处理,而不是由parsing处理器(参阅mod_include模块)来处理。

extension 参数是大小写无关的,并且可以带也可以不带先导的点。

top

RemoveInputFilter 指令

说明:删除指定扩展名与输入过滤器之间的关联
语法:RemoveInputFilter extension [extension] ...
上下文:虚拟主机, 目录, .htaccess
覆盖项:FileInfo
状态:Base
模块:mod_mime
兼容性:RemoveInputFilter is only available in Apache 2.0.26 and later.

RemoveInputFilter 指令删除指定的扩展名与输入过滤器之间的关联。子目录中的.htaccess文件可以通过这条指令取消从父目录或服务器配置文件中继承过来的扩展名与输入过滤器之间的关联关系。

extension 参数是大小写无关的,并且可以带也可以不带先导的点。

top

RemoveLanguage 指令

说明:删除指定的扩展名与内容语言之间的关联
语法:RemoveLanguage extension [extension] ...
上下文:虚拟主机, 目录, .htaccess
覆盖项:FileInfo
状态:Base
模块:mod_mime
兼容性:RemoveLanguage is only available in Apache 2.0.24 and later.

RemoveLanguage 指令删除指定的扩展名与内容语言之间的关联。子目录中的.htaccess文件可以通过这条指令取消从父目录或服务器配置文件中继承过来的扩展名与内容语言之间的关联关系。

extension 参数是大小写无关的,并且可以带也可以不带先导的点。

top

RemoveOutputFilter 指令

说明:删除指定扩展名与输出过滤器之间的关联
语法:RemoveOutputFilter extension [extension] ...
上下文:虚拟主机, 目录, .htaccess
覆盖项:FileInfo
状态:Base
模块:mod_mime
兼容性:RemoveOutputFilter is only available in Apache 2.0.26 and later.

RemoveOutputFilter 指令删除指定的扩展名与输出过滤器之间的关联。子目录中的.htaccess文件可以通过这条指令取消从父目录或服务器配置文件中继承过来的扩展名与输出过滤器之间的关联关系。

extension 参数是大小写无关的,并且可以带也可以不带先导的点。

示例

RemoveOutputFilter shtml

参见

top

RemoveType 指令

说明:删除指定扩展名与内容类型之间的关联
语法:RemoveType extension [extension] ...
上下文:虚拟主机, 目录, .htaccess
覆盖项:FileInfo
状态:Base
模块:mod_mime

RemoveType 指令删除指定的扩展名与内容类型之间的关联。子目录中的.htaccess文件可以通过这条指令取消从父目录或服务器配置文件中继承过来的扩展名与内容类型之间的关联关系。举例来说,它可以这样来使用:

/foo/.htaccess:

RemoveType .cgi

这将删除/foo目录及其所有子目录下.cgi文件的特定处理方式,从而使这些文件按DefaultType 指令设定的缺省类型来处理。

注意

RemoveType 指令会在所有的AddType 指令之后处理,因此,当同一个目录配置中,同时存在这两种指令的时候,前面的RemoveType 指令会取消后面的AddType 指令的作用。

extension 参数是大小写无关的,并且可以带也可以不带先导的点。

top

TypesConfig 指令

说明:指定mime.types文件的位置
语法:TypesConfig file-path
默认值:TypesConfig conf/mime.types
上下文:服务器配置
状态:Base
模块:mod_mime

TypesConfig 指令设定媒体类型配置文件的位置。File-path路径是相对于ServerRoot目录的。媒体类型配置文件列出了文件扩展名与内容类型的缺省映射关系。大多数管理员使用既定的mime.types列表文件,它关联了文件扩展名和由IANA注册的内容类型。最新的列表可以在http://www.isi.edu/in-notes/iana/assignments/media-types/media-types得到。这样做可以大大简化httpd.conf文件里的媒体类型定义,在需要时,也可以用AddType 指令来更改这些定义。你不应该编辑mime.types文件,因为在服务器升级的时候,它会被覆盖。

文件包含类似于AddType 指令参数格式的行:

MIME-type [extension] ...

扩展名的大小写是无关紧要的。空行以前以井号(#)打头的行会被忽略。

不要要求Apache HTTP服务器项目组在已经发布的mime.types文件中增加新的项,除非(1)它们已经在IANS注册过了,或者(2)它们被广泛地使用,并且在多平台上没有文件扩展名冲突发生。category/x-subtype请求会被自动拒绝,因为任何新的二字母的扩展名很可能会与已经非常拥挤的语言及字符集名字空间冲突。

参见

 


项目维护者: kajaa [本文译者: Daniel * ]

项目说明 | 项目进度 | 项目讨论区 | Apache手册中文版