`
hongtoushizi
  • 浏览: 374744 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

CH9001: 各浏览器对常用或者错误的 Content-Type 类型处理方式不一致

阅读更多

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 类型参见:

问题描述

Content-Type 报头字符串代表着服务器端发送给客户端浏览器的具体数据类型,浏览器将根据这个信息决定如何处理得到的数据内容。比如:'Content- Type:text/html' 表示着这是个 HTML 文件,需要渲染引擎解释内容后输出;'Content-Type: application/octet-stream' 表示这是个二进制流,需要下载到本地后由用户端环境决定如何使用。

每个浏览器内置支持的 Content-Type 类型表各不相同,这导致了某些类型字符串在某些浏览器下不被识别;另外,如果出现错误的 Content-Type 类型,各个浏览器又会以不同的方式处理。

造成的影响

未知的或者是错误的 Content-Type 类型,在各个浏览器中处理方式不一致,草率对待将有可能使得同一文件在各种浏览器中展现方式完全不同。

受影响的浏览器

所有浏览器
 

问题分析

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

<?php
  $contentTypeList = array(
    '0'=>'Content-Type: text/plain',
    '1'=>'Content-Type: application/octet-stream',
    '2'=>'Content-Type: application/x-rar-compressed',
    '3'=>'Content-Type: application/zip',
    '4'=>'Content-Type: application/x-shockwave-flash',
    '5'=>'Content-Type: video/quicktime',
    '6'=>'Content-Type: video/mp4',
    '7'=>'Content-Type: audio/mpeg',
    '8'=>'Content-Type: image/jpeg',
    '9'=>'Content-Type: image/gif',
    '10'=>'Content-Type: image/png',
    '11'=>'Content-Type: application',
    '12'=>'Content-Type: audio',
    '13'=>'Content-Type: video',
    '14'=>'Content-Type: image',
    '15'=>'Content-Type: helloworld'
    );
  header($contentTypeList[$_GET["type"]]."; charset=UTF-8");
?>

PHP 的文件中建立了 16 种 Content-Type 类型,根据 URL 中 GET 参数值选取其中一种文件类型 HTTP 报头发向客户端浏览器。其中 11 种常用类型,4 种故意写错的类型,1 种完全自定义类型:

  文件类型 Content-Type 类型 常见类型 书写有误类型 浏览器不可识别类型
文本 text/plain
二进制流 application/octet-stream
RAR 压缩包 application/x-rar-compressed
Zip 压缩包 application/zip
Flash 文件 application/x-shockwave-flash
QuickTime 视频 video/quicktime
MP4 视频 video/mp4
MP3 音频 audio/mpeg
JPEG 图片 image/jpeg
GIF 图片 image/gif
PNG 图片 image/png
数据 application
音频 audio
视频 video
图像 image
自定义类型 helloworld

分别以不同 HTTP Content-Type 报头类型运行此段代码,在不同的浏览器环境中的表现如下:

  IE6 IE7 IE8 Firefox Chrome Safari Opera text/plain application/octet-stream application/x-rar-compressed application/zip application/x-shockwave-flash video/quicktime video/mp4 audio/mpeg image/jpeg image/gif image/png application audio video image helloworld
显示文件内容 显示文件内容 显示文件内容 显示文件内容 显示文件内容
显示文件内容 下载文件 下载文件 下载文件 显示文件内容
下载文件1 下载文件 下载文件 下载文件 下载文件
下载文件1 下载文件 下载文件 下载文件 下载文件
试图显示 Flash 试图显示 Flash 试图显示 Flash 试图显示 Flash 试图显示 Flash
下载文件 下载文件 下载文件 下载文件 下载文件
下载文件 下载文件 试图播放视频3 下载文件 下载文件
下载文件 下载文件 试图播放视频3 下载文件 下载文件
显示文件内容 试图显示图片2 试图显示图片 试图显示图片 试图显示图片
显示文件内容 试图显示图片2 试图显示图片 试图显示图片 试图显示图片
显示文件内容 试图显示图片2 试图显示图片 试图显示图片 试图显示图片
下载文件1 显示文件内容 显示文件内容 下载文件 显示文件内容
下载文件1 显示文件内容 显示文件内容 下载文件 显示文件内容
下载文件1 显示文件内容 显示文件内容 下载文件 显示文件内容
下载文件1 显示文件内容 显示文件内容 下载文件 显示文件内容
下载文件1 显示文件内容 显示文件内容 下载文件 显示文件内容

【注1】:这几种 Content-Type 类型在测试环境中的 IE6 IE7 IE8 浏览器弹出的下载对话框提示中,均显示“不可识别类型”

【注2】:Firefox 会将 URL 和一些错误信息输出在图片格式中显示。

【注3】:Chrome 试图使用 VIDEO 标记直接显示这两种格式的视频。

由表可见:

  • IE6 IE7 IE8 对于可以识别的非视频、音频流内容均会嗅探其内容,并且根据内容是否正常再决定如何输出显示;
    (关于嗅探的扩展阅读:CH9002: IE6 IE7 IE8 未按预期方式处理 content-type 为 text/plain 的内容
  • Firefox Chrome 对于未知 Content-Type 的内容均直接显示其内容,其他类型则以直接以最合适的方式处理;
  • Opera 对于可以识别的视频、音频流内容会直接提示下载,图片类型和 Flash 类型会试图显示他们,未知 Content-Type 的内容均直接显示其内容则直接显示其内容,但在显示内容前不会嗅探其中的 HTML 标记。

解决方案

这个问题比较复杂,如需避免出现显示异常,建议不要使用非法的 Content-Type 头字符串;并且文件实际内容和数据格式应与 Content-Type 头字符串内类型声明一致。

 

转载自: http://www.w3help.org/zh-cn/causes/CH9001

分享到:
评论

相关推荐

    CSS样式代码大全

    `list-style-type`**:设置列表项标记类型。 - **取值**: - `disc`:实心圆点。 - `circle`:空心圆圈。 - `square`:方块。 - 更多类型可参考文档。 #### 六、生成内容 Generated Content **1. `content:...

    php获得文件的mime type类

    MIME类型是一种标准,用于定义文件的类型和编码方式,它可以帮助服务器和浏览器正确地处理和显示各种格式的数据。在这个“php获得文件的mime type类”中,我们将深入探讨如何在PHP中实现这一功能。 首先,我们要...

    mimini:迷你PHP浏览器

    Mimini项目可能还包括了对响应的解析和处理,以及对自动化流程的控制逻辑。它可能使用PHP的异常处理机制来捕获和处理错误,以及使用面向对象编程(OOP)来封装和模块化功能。在`mimini-master`目录中,可能包含了...

    PHP通过CURL下载文件

    header("Content-type: application/$file_type"); // 设置Content-Type header("Content-Disposition: attachment; filename=\"$file_name\""); // 设置Content-Disposition,以附件形式下载 header("Content-...

    XML应用开发(软件品牌)-1期 第4单元 单元测试卷-使用CSS显示XML文档.doc

    处理指令 `&lt;?xml:stylesheet&gt;` 是XML中引入CSS样式单的方式,`type` 属性用于指定样式单的类型,通常为 `text/css`,表明是CSS样式单。`href` 属性则用于指定外部样式单的URL,使得XML文档可以根据这个链接加载并...

    PHP经典实例--Web基础

    - **定义与用途**:Cookie是一种小型文本文件,服务器存储在客户端(用户的浏览器)上,用于存储用户偏好、登录状态等信息。PHP提供了`setcookie()`函数来设置Cookie,并通过`$_COOKIE`全局变量访问已设置的Cookie...

    php使用curl模拟浏览器表单上传文件或者图片的方法

    在这个数组中,`name`字段是文件的原始名称,`type`是文件类型,`tmp_name`是服务器上临时存储的文件位置(在上传过程中创建),`error`是错误代码(0表示成功),`size`是文件大小。 注意,服务器端的处理脚本(如...

    web-前端开发-6.pptx

    /*重置浏览器的默认样式*/ body, p, ul, li, h4, img { margin: 0; padding: 0; border: 0; list-style: none; } 知识点三:CSS 样式应用 在本节课中,我们需要应用 CSS 样式来控制页面的样式和布局。我们定义...

    PHP基于curl post实现发送url及相关中文乱码问题解决方法

    在PHP开发过程中,有时我们需要...同时,理解`content-type`的作用和设置方式也是非常重要的,这有助于避免在处理不同格式数据时出现问题。在实际开发中,多查阅文档、多尝试不同的解决方案,通常都能找到问题的答案。

    实现并发的httpd简单服务器

    为了提高服务器性能,需要采用多线程或多进程的方式处理客户端连接。一种常见方法是在接受每个新连接时创建一个新的子进程来处理该连接。 ```c pid_t pid = fork(); if (pid ) { perror("fork"); } else if (pid &gt;...

    求帮忙修改个php curl模拟post请求内容后并下载文件的解决思路

    `Content-Type`设置为`application/octet-stream`,这是一种通用的二进制数据类型,适用于各种文件。`Content-Disposition`头信息设置了附件的名称,`Content-Length`则告诉浏览器文件的大小。 然后,我们使用`file...

    php典型模块精解

    header('Content-Type: image/png'); imagepng($image); // 释放图像资源 imagedestroy($image); ?&gt; ``` 以上介绍了 PHP 中三个常用的典型模块:MySQLi、cURL 和 GD。这些模块为 PHP 开发者提供了强大的功能,可以...

    基于PHP的Simple Proxy Ajax的跨域调用.zip

    header('Content-Type: application/json'); // 设置响应内容类型,根据API返回的数据类型调整 echo $response; // 将API的响应数据回传给前端 ?&gt; ``` 2. **前端Ajax调用**:在前端JavaScript代码中,使用Ajax...

    基于PHP的cURL快速入门.pdf

    - `content_type`:响应的内容类型。 - `http_code`:HTTP状态码。 - `total_time`:执行整个请求所花费的总时间。 #### 六、高级功能 ##### 1. 基于浏览器的重定向 cURL还支持模拟浏览器行为,例如处理基于...

    上传下载的实现代码

    在这个过程中,需要考虑文件大小限制、文件类型检查、错误处理和安全问题,比如防止恶意文件上传。 下载功能则是服务器将文件发送给客户端的过程。在Web上,这通常通过设置HTTP响应头的`Content-Disposition`为`...

    Ch6_万维网和HTTP协议1

    HTTP头中的Content-Type字段用来指示响应体的数据类型及字符集。 总结,万维网和HTTP协议构成了我们日常浏览网页、在线交流的基础。理解这些基本概念,有助于我们更好地理解和利用网络资源,同时对于网络开发和故障...

    php通过curl添加cookie伪造登陆抓取数据的方法

    首先,你需要登录目标网站并使用浏览器的开发者工具(例如Firefox的Firebug)来查看发送到服务器的cookie。这些cookie通常包含会话标识和其他必要的登录信息。复制这些cookie值,以便在cURL请求中使用。 2. **使用...

    php中运用http调用的GET和POST方法示例

    在实际应用中,应添加错误处理代码,以捕获并处理可能出现的cURL错误。例如: ```php if (curl_errno($ch)) { echo 'Error:' . curl_error($ch); } ``` ### 结论 PHP中的cURL库提供了强大的功能,使得开发者能够...

    PHP CURL 126好友邀请 126邮箱登录

    在实际开发过程中,为了应对网络不稳定情况,我们还可以添加错误处理和重试逻辑。例如,当请求返回非200状态码时,可以尝试等待一段时间后重试,直到达到预设的重试次数。 总结来说,使用PHP和cURL进行126邮箱登录...

    php实现模拟post请求用法实例

    在Web开发中,模拟POST请求是一个常见的需求,尤其是在测试、调试API或者与第三方服务交互时。PHP作为一门广泛用于服务器端编程的语言,提供了多种方式来模拟HTTP POST请求。本文将详细探讨PHP实现模拟POST请求的三...

Global site tag (gtag.js) - Google Analytics