Apache源代码解析之MIME

本文介绍了Apache中MIME的用途,MIME类型用于标识HTTP数据类型,如text/html等。MIME信息通过Content-type定义,服务器使用AddType和AddEncoding指令处理自定义或扩展的MIME类型。数据组织中,http_mime.c文件使用链表存储标准和自定义MIME映射。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

节选自《Apache源代码解析-基于Apache0.6.5》第六章。

网址:http://www.oldapache.org

论坛:http://bbs.oldapache.org

邮箱:tsingien@gmail.com

 


 

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》第六章。

网址:http://www.oldapache.org

论坛:http://bbs.oldapache.org

邮箱:tsingien@gmail.com

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值