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, SetOutputFiltercore的指令会覆盖任何在mod_mime模块中定义的文件扩展名映射。

注意,改变一个文件的元信息,不会改变Last-Modified头的值。因此,以前被缓存的副本可能还会被用户或代理服务器使用。如果你改变了元信息(语言、内容类型、字符集、编码方式),你需要"触及"所有相关文件(更新他们的最后修改时间),以保证所有的访问者都收到正确的内容标题。

带多扩展名的文件

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

语言内容编码会按照积累的方式处理,因为一个文件可以被指定为多种语言或编码。因此,welcome.html.en.de文件将会按照Content-Language: en, deContent-Type: text/html发送。

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

内容编码

一个具有特定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-gzipx-compress ,然而,按标准来说,它们分别等同于gzipcompress 。Apache在进行编码方式映射时,会忽略"x-"前缀。当响应需要包含编码方式时,Apache会使用客户端请求的格式(例如:x-foofoo)来应答。如果客户端没有指明特定的格式,Apache会使用AddEncoding指令给定的编码方式。为了简化这一问题,你应该为这两个特定的编码方式始终使用x-gzipx-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与对服务将返回给客户的信息进行处理的输出过滤器之间建立映射。这是除包括SetOutputFilterAddOutputFilterByType指令在内的所有过滤器定义指令之外定义。这个映射会与所有有效的定义合并,并覆盖所有相同的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&#124;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指令为 Onmod_mime会将请求解析成/bar/foo.shtml ,于是象"AddOutputFilter INCLUDES .shtml"这样的指令就会使用INCLUDES过滤器来处理这个请求。如果没有设定ModMimeUsePathInfo指令,则不会使用INCLUDES过滤器。

参见

  • AcceptPathInfo

MultiviewsMatch 指令

说明 在使用MultiViews查询所匹配的文件时要包含的文件类型
语法 MultiviewsMatch Any&#124;NegotiatedOnly&#124;Filters&#124;Handlers [Handlers&#124;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指令为HandlersFilters ,也可以两个都选。如果其它所有因素都相等,则会选择最小的那个文件来提供服务。例如,在一个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指令参数格式的行:

<var class="calibre40">MIME-type</var> [<var class="calibre40">extension</var>] ...

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

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

参见

  • mod_mime_magic

``