打印

CH9002: IE6 IE7 IE8 未按预期方式处理 content-type 为 text/plain 的内容

作者:陆远 钱宝坤

标准参考

content-type 用于定义用户的浏览器或相关设备如何显示将要加载的数据,或者如何处理将要加载的数据,此属性的值可以查看 MIME 类型。

MIME (Multipurpose Internet Mail Extensions,多用途互联网邮件扩展) 是描述消息内容类型的因特网标准。MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。

content-type 一般以下面的形式出现:

Content-Type: [type]/[subtype]; parameter

type 有下面的形式:

  • Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;
  • Multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的数据;
  • Application:用于传输应用程序数据或者二进制数据;
  • Message:用于包装一个E-mail消息;
  • Image:用于传输静态图片数据;
  • Audio:用于传输音频或者音声数据;
  • Video:用于传输动态影像数据,可以是与音频编辑在一起的视频数据格式。

subtype 用于指定 type 的详细形式。“type/subtype”配对的集合和与此相关的参数。下面是最经常用到的一些 MIME 类型:

  • text/html(HTML 文档);
  • text/plain(纯文本);
  • text/css(CSS 样式表);
  • image/gif(GIF 图像);
  • image/jpeg(JPG 图像);
  • application/x-javascript(JavaScript 脚本);
  • application/x-shockwave-flash(Flash);
  • application/x- www-form-urlencoded(使用 HTTP 的 POST 方法提交的表单);
  • multipart/form-data(同上,但主要用于表单提交时伴随文件上传的场合)。

关于 content-type 的详细信息,请参考 HTML4.01 规范 6.7 Content types (MIME types) 中的内容。

关于 MIME 的详细信息,请参考 IETF[RFC2045][RFC2046] 规范。

更多的 MIME 类型参见:http://www.utoronto.ca/webdocs/HTMLdocs/Book/Book-3ed/appb/mimetype.html

问题描述

在 IE6 IE7 IE8 中,若一个页面被打开时接收到的响应头的 content-type 为 text/plain,浏览器会尝试嗅探页面文件内实际内容来判断是否可能为一个 HTML 文档,若是则会以 text/html 的方式将页面作为 HTML 文档解释,而不是将其作为纯文本内容处理。

造成的影响

这将导致 content-type 为 text/plain 的页面在 IE6 IE7 IE8 中仍作为 text/html 去解释,导致代码以 HTML 被渲染,而不是预期的文本格式。

若由于设置不当,将一个 content-type 本应该为 text/html 的 HTML 页面误设置为 text/plain,且此页面仅在 IE6 IE7 IE8 中调试,则其他浏览器中均无法看到渲染后的页面,而是页面的源代码。

受影响的浏览器

IE6 IE7 IE8  

问题分析

创建一个 Web 服务器,如 Apache。在服务器上编写一段动态代码,如:ct_plain.php

<?php header('Content-Type: text/plain'); ?> <!DOCTYPE html>
                <html> <head> </head> <body> <h1>This is a test page!</h1>
                </body> </html>

PHP 的“header()”函数向客户端发送原始的 HTTP 报头,即通知浏览器这是一个纯文本(text/plain)类型。

这段代码在不同的浏览器环境中的表现:

IE6 IE7 IE8 Firefox Chrome Safari Opera
This is a test page!
<!DOCTYPE html> <html> <head> </head>
                      <body> <h1>This is a test page!</h1> </body> </html>

可见:

  • IE6 IE7 IE8 中,对于 content-type 为“text/plain”的 HTTP 响应头,浏览器仍然会尝试以“text/html”的方式将其解析为 HTML 页面,而不是以纯文本的方式显示。
    其解析的具体规则为:嗅探文件内实际内容,如果从文件内容起开始计算的 200 个 ASCII 字符内,存在可明显被识别的 HTML、BODY、HEAD、TITLE 标记则,将该文件解释为 HTML 文件类型并渲染出来。

    建立一个 txt 文本文件,其中输入以下内容(实际 200 个 ASCII 字符,包含 TITLE 标签):plain.txt

    0120123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789<title>
    将此文件配置到服务端,通过 IE 访问此远程文件可以得到被解析为 HTML 格式的文本。

  • 其他浏览器 中,则是遵照响应头中 content-type 类型以纯文本的方式显示内容,所以页面的代码被显示出来。

对于 IE6 IE7 IE8 的嗅探机制还不止于此,实际测试证明,对于常用可识别的非视频、非音频的 content-type 类型,如:'application/octet-stream'、'application/x-shockwave-flash'、'image/jpeg'、'image/gif、‘image/png’ 类型中均会启用嗅探机制。此处就不再一一测试证明,有兴趣的读者可以自行运行测试样例 ct_test.php 观看结果。

解决方案

这是由于 IE 浏览器的特有内容嗅探机制导致,故在不修改服务器端代码的情况下,无法通过常规办法解决此 IE 特性问题。更多关于此问题的资料参考官方信息:Internet Explorer 未按预期方式处理“Text/Plain”内容类型

合理、正确地设置文档的 content-type 是最佳的解决方案,同时应避免在非 HTML 文件中出现可被 IE6 IE7 IE8 嗅探机制捕获的 HTML、BODY、HEAD、TITLE 标记书写格式。

参见

知识库

相关问题

测试环境

操作系统版本: Windows 7 Ultimate build 7600
浏览器版本: IE6
IE7
IE8
Firefox 3.6
Chrome 5.0.342.2 dev
Safari 4.0.4
Opera 10.50
测试页面: ct_plain.php
plain.txt
ct_test.php
本文更新时间: 2010-08-02

关键字

content-type 文本 文档类型 plain html IE 内容嗅探