Apache模块 mod_mime_magic

说明 通过读取部分文件内容自动猜测文件的MIME类型
状态 扩展(E)
模块名 mime_magic_module
源文件 mod_mime_magic.c

概述

本模块采取Unix系统下file(1)命令相同的方法:检查文件开始的几个字节,来判定文件的MIME类型。它被作为当mod_mime无法解析时,用来处理的"第二道防线"。

本模块源自于Unix系统命令file(1)的一个自由版本,它通过对来自文件的内容使用"Magic数字"和其它一些线索来判定这个文件的具体内容是什么。本模块只有当"Magic文件"在MimeMagicFile指令中指定时才有效。

"Magic文件"的格式

Magic文件的内容是由4-5列的纯文本组成的。文件中允许包含空行,但会被忽略。注释行使用井号(#)来引导。剩余的行按下面列被分解:

描述
1 开始检查的起始字节,">"表示基于前面的非">"行。
2 匹配的数据类型 byte 单个字符 short 机器字节顺序的16位整数 long 机器字节顺序的32位整数 string 任意长度的字符串 date 长整型的日期(从UNIX纪元/1970以来的秒数) beshort big-endian 16位整数 belong big-endian 32位整数 bedate big-endian 32位整型日期 leshort little-endian 16位整数 lelong little-endian 32位整数 ledate little-endian 32位整型日期
3 匹配的数据内容
4 如果匹配文件的MIME类型
5 如果匹配文件的MIME编码方式(可选)

例如,下面的Magic文件行可以认出一些音频格式:

# Sun/NeXT audio data
0      string      .snd
>12    belong      1       audio/basic
>12    belong      2       audio/basic
>12    belong      3       audio/basic
>12    belong      4       audio/basic
>12    belong      5       audio/basic
>12    belong      6       audio/basic
>12    belong      7       audio/basic
>12    belong     23       audio/x-adpcm

还有下面的示例可以区分带*.doc扩展名的文件到底是Microsoft Word文档还是Frame Maker文档(两种有相同后缀名但不兼容文件格式)。

# Frame
0  string  \<MakerFile        application/x-frame
0  string  \<MIFFile          application/x-frame
0  string  \<MakerDictionary  application/x-frame
0  string  \<MakerScreenFon   application/x-frame
0  string  \<MML              application/x-frame
0  string  \<Book             application/x-frame
0  string  \<Maker            application/x-frame

# MS-Word
0  string  \376\067\0\043            application/msword
0  string  \320\317\021\340\241\261  application/msword
0  string  \333\245-\0\0\0           application/msword

一个可选的MIME编码方式可以包含在第五列上。例如下面的行可以认出gzip压缩文件并设定他们的编码方式。

# gzip (GNU zip, not to be confused with
#       [Info-ZIP/PKWARE] zip archiver)

0  string  \037\213  application/octet-stream  x-gzip

性能问题

并不是每个系统都适用本模块的。如果你的系统吞吐量已经接近极限,或者你在进行web服务器的基准测试,你可能不希望启动这个模块,因为它的处理会显著影响服务器的性能。

然而,已经有人在努力改进最初的file(1)代码,使它能更适合在一个非常繁忙的web服务器上工作。这主要是用在那种有数千用户自己发布文档的web服务器上。这在互联网上可能是非常常见的情况。很多情况下,如果服务器能就文件的内容作出比用文件名来区别的方式更加智能化的判断是非常有用的。甚至在当用户没有合理地命名他们的文件的情况下,它也可以用来减少那些诸如:"为什么我的页面不工作啊"之类的报怨。你必须自己决定这额外的开销是否适用于你的环境。

注意

下面关于mod_mime_magic的记录包含在这里,是按照最初捐助者的版权限制和为了得到他们的承认。

mod_mime_magic: 通过文件的Magic Number查找文件的MIME类型 Copyright (c) 1996-1997 Cisco Systems, Inc.

本软件由Cisco系统有限公司于1997年7月提交给Apache组织。本软件源代码的进一步修订及新版本的派生必须承认Cisco系统有限公司是本模块的原始捐助者。所有其它许可与使用条件都属于Apache组织。

本模块的部分源代码派生于最初发布在comp.sources.unix上的file命令的自由版本。根据要求,下面包含了那个程序的版权信息。

  • Copyright (c) Ian F. Darwin, 1987. Written by Ian F. Darwin.

本软件不隶属于美国电话电报公司(AT&T)或者加利福尼亚大学董事会的任何许可。

在遵循以下限制的基础上,任何人被授权免费地在任何计算机系统上为任何目的使用、修改与重新分发这个软件:

  1. 不管后果有多严重,甚至是直接由于程序的缺陷造成的,程序的作者对于由于使用这个软件而造成的任何直接或间接的后果不承担任何责任。
  2. 在清晰或冗长的声明中,软件的来源必须无误地叙述。由于少量用户可能会阅读源代码,源代码中也必须包含这一声明。
  3. 改动版本必须明白标明,必须与原软件严格区分开来。由于少量用户可能会阅读源代码,源代码中也必须包含这一声明。
  4. 本声明不能被删除或更改。

为了符合MrDarwin的条款:这是从自由的"file"命令而来并经过了明显的修改的版本。

  • 当从Apache的一个版本转移到下一个时,为了编辑方便,所有代码在一个文件中。
  • 内存分配通过Apache应用程序接口的缓冲池结构完成。
  • 在需要调用其它Apache应用程序接口例程的地方,所有的函数被提供必需的Apache应用程序接口及服务结构。(例如:通常在它自身或被调用的程序里包含了日志记录,文件操作或内存分配)
  • Magic结构从数组被转换成了单终点链表,因为它每次只增长一条记录,它只按顺序方式处理,同时Apache API没有realloc()的替代处理方法。
  • 函数被改变成从参数获取服务器配置,而不是全局变量。(现在它应该是可重入的,但没有在线程化的环境中测试过)
  • 原来用来打印结果到stdout的地方,被改成将结果保存到一个列表,这个列表被用来在Apache请求记录中设置MIME类型。
  • 因为在这里再也不会用到命令行标志,它们被删除了。

MimeMagicFile 指令

说明 使用特定的Magic文件激活根据文件内容确定文件MIME类型的功能
语法 MimeMagicFile file-path
作用域 server config, virtual host
状态 扩展(E)
模块 mod_mime_magic

MimeMagicFile指令用来激活本模块,默认的Magic文件保存在conf/magic中。相对路径是相对于ServerRoot的。虚拟主机会使用与主服务器相同的配置文件,除非使用了更特别的设定。在后者情况下,这些特别的设定会覆盖主服务的设定。

示例

      MimeMagicFile conf/magic