节选自《Apache源代码解析-基于Apache0.6.5》第六章。
6.1 概述
MIME的英文全称是"Multipurpose Internet Mail Extensions",即多目的Internet邮件扩展(协议)。它设计的最初目的是为了在发送电子邮件时附加多媒体数据,让邮件客户程序能根据其类型进行处理。
最早的HTTP协议中,并没有附加的数据类型信息,所有传送的数据都被客户程序解释为超文本标记语言HTML 文档,而为了支持多媒体数据类型,HTTP协议中就使用了附加在文档之前的MIME数据类型信息来标识数据类型。
例如,假设你要传送一个Microsoft Excel文件到客户端。那么这时的MIME类型就是“application/vnd.ms-excel”。在大多数实际情况中,这个文件然后将传送给 Execl来处理(假设我们设定Execl为处理application/vnd.ms-excel类型的应用程序)。
每个MIME类型由两部分组成,从mime.types文件中能看到常见媒体格式的MIME定义:
text/html html
text/plain txt
text/richtext rtx
服务器传输数据到客户端的时候,传输的是数据流,这样客户端并不知道接受的数据是什么MIME类型,所以服务器在发送真正的数据前,需要发送标识数据的 MIME信息,这个信息使用Content-type关键字进行定义,例如对应HTML文档,服务器将首先发送下列两行MIME标识信息,这个标识并不是 真正的数据文件的一部分:
Content-type: text/html
第二行是一个空行,使用空行的目的是将MIME信息与真正的数据内容分隔开。
配置文件mime.types中定义了一些常见的标准MIME类型。
本章中涉及的内容有些是为第9章内容服务,如果您觉得阅读本章内容比较乏味或不知道为什么要这样做,可以参考第9章的实际应用部分。
6.2 配置指令
配置文件mime.types中定义了一些标准MIME类型,一般不建议修改这些内容,如果你需要添加自定义的或扩展的MIME类型,可以通过AddType和AddEncoding指令设置。
建议自定义MIME添加指令添加在srm.conf文件中。
1. AddType 指令
语法:AddType
MIME-type extension [
extension ] ..
功能:
在给定的文件扩展名与特定的内容类型间建立映射
示例:AddType image/gif .gif
上例说明,以.gif为扩展名的文件的MIME类型为image/gif
2. AddEncoding 指令
语法:AddEncoding
MIME-enc extension [
extension ] ...
功能:
在文件扩展名与特定的编码方式间建立映射关系
示例:A ddEncoding x-gzip .gz
上例说明,以.gz为扩展名的文件的编码方式为x-gzip
6.3 数据组织
http_mime.c文件中定义了三个mime_ext结构链表来存储标准和自定义MIME,mime_ext的结构如下:
struct mime_ext {
char *ext; //扩展名
char *ct; //媒体类型
struct mime_ext *next; //下条记录
};
三个链表分别为:
1.系统默认已经定义的[扩展名/内容类型]映射关系链表数组
struct mime_ext *types[27];
26个字母,以开头字母为标记分组所有MIME记录,这个记录conf/mime.types文件中定义的MIME,读取配置文件后,内存中的数据类似于下图所示:

2.用户自定义[扩展名/内容类型]映射关系链表。
struct mime_ext *forced_types;
如果添加了AddType image/gif .gif这样的定义,内存中的数据类似于下图所示:
3.编码方式链表
struct mime_ext *encoding_types;
如果添加了AddEncoding x-gzip .gz
这样的定义,内存中的数据类似于下图所示:
6.4 代码注释
本章代码主要包括http_mime.c,还包括部分配置文件的读取,配置文件读取部分我们将在第11章中详细描述。
限于篇幅,注释代码部分请参看本书官网。
节选自《Apache源代码解析-基于Apache0.6.5》第六章。