正确配置服务器 MIME 类型

MIME类型描述了内容的媒体类型,无论是电子邮件中的内容,还是由Web服务器或Web应用程序提供的内容。它们旨在帮助提示内容应如何被处理和显示。

MIME类型示例

  • HTML文档使用text/html
  • 纯文本使用text/plain
  • 层叠样式表使用text/css
  • JavaScript文件使用text/javascript
  • Markdown文件使用text/markdown
  • 当预期用户操作时,二进制文件使用application/octet-stream

服务器的默认配置差异很大,并为没有定义内容类型的文件设置不同的默认MIME类型值。

2.2.7之前的Apache Web服务器版本被配置为对未知内容类型报告MIME类型text/plainapplication/octet-stream。现代版本的Apache对未知内容类型的文件报告none

Nginx如果未定义默认内容类型,将报告text/plain

随着新的内容类型被发明或添加到Web服务器,Web管理员可能未能将新的MIME类型添加到其Web服务器的配置中。这对于尊重Web服务器和应用程序报告的MIME类型的浏览器用户来说是主要问题来源。

为什么正确的MIME类型很重要?

如果Web服务器或应用程序为内容(包括未知内容的“默认类型”)报告了不正确的MIME类型,Web浏览器无法知道作者的意图。这可能会导致意外行为。

一些Web浏览器可能会尝试猜测正确的MIME类型。这使得配置错误的Web服务器和应用程序能够继续为这些浏览器工作(但不包括正确实现标准的其他浏览器)。除了违反HTTP规范之外,这还有另外几个重要原因,使其成为一个糟糕的主意

失去控制

如果浏览器忽略了报告的MIME类型,Web管理员和作者将无法控制其内容的处理方式。

例如,一个面向Web开发人员的网站可能希望将某些示例HTML文档作为text/htmltext/plain发送,以便将文档作为HTML处理和显示或作为源代码显示。如果浏览器猜测MIME类型,则作者不再拥有此选项。

安全

某些内容类型,例如可执行程序,本质上是不安全的。因此,这些MIME类型通常在Web浏览器接收到该类型内容时将采取的操作方面受到限制。可执行程序不应在用户的计算机上执行,并且至少应弹出一个对话框,询问用户是否希望下载该文件。

JavaScript的遗留MIME类型

在查找JavaScript MIME类型信息时,您可能会看到几个引用JavaScript的MIME类型。其中一些MIME类型包括

  • application/javascript
  • application/ecmascript
  • application/x-ecmascript
  • application/x-javascript
  • text/ecmascript
  • text/javascript1.0
  • text/javascript1.1
  • text/javascript1.2
  • text/javascript1.3
  • text/javascript1.4
  • text/javascript1.5
  • text/x-ecmascript
  • text/x-javascript

虽然浏览器可能支持这些替代MIME类型中的任何一种、部分或全部,但您应该使用text/javascript来指示JavaScript文件的MIME类型。

注意:有关更多信息,请参阅MIME类型 (IANA媒体类型)

如何确定要设置的MIME类型

有几种方法可以确定用于提供内容的正确MIME类型值。

  • 如果您的内容是使用商业软件创建的,请阅读供应商的文档,查看该应用程序应报告哪些MIME类型。
  • 在IANA的MIME媒体类型注册表中查找,其中包含所有注册MIME类型的信息。
  • FILExt文件扩展名参考中搜索文件扩展名,查看与该扩展名关联的MIME类型。请密切注意,因为应用程序可能具有多个MIME类型,这些类型仅在一个字母上有所不同。

如何检查接收到的内容的MIME类型

  • 在 Firefox 中

    • 加载文件并转到工具 > 页面信息以获取您访问的页面的内容类型。
    • 您还可以转到工具 > Web开发者 > 网络并重新加载页面。请求选项卡会列出页面加载的所有资源。点击任何资源将列出所有可用信息,包括页面的Content-Type标头。
  • 在 Chrome 中

    • 加载文件并转到视图 > 开发者 > 开发者工具,然后选择网络选项卡。重新加载页面并选择您要检查的资源。在头部中查找Content-Type,它将报告资源的内容类型。
  • 在页面源中查找提供MIME类型的<meta>元素,例如<meta http-equiv="Content-Type" content="text/html">

    • 根据标准,如果存在Content-Type标头,则指定MIME类型的<meta>元素应被忽略。

IANA维护着一份注册的MIME媒体类型列表。HTTP规范定义了MIME类型的超集,用于描述Web上使用的媒体类型。

如何设置服务器以发送正确的MIME类型

目标是配置您的服务器,使其为每个文档发送正确的Content-Type标头。

  • 如果您正在使用Apache Web服务器,请查看Apache配置:.htaccess的“媒体类型和字符编码”部分,以获取不同文档类型及其对应MIME类型的示例。
  • 如果您正在使用Nginx,请注意Nginx没有.htaccess等效工具,因此所有更改都将进入主配置文件。
  • 如果您正在使用服务器端脚本或框架生成内容,指示内容类型的方式将取决于您使用的工具。请查阅框架或库的文档。

无论您使用何种服务器系统,您需要实现的效果是设置一个名为Content-Type的响应头,后跟冒号和空格,再后跟MIME类型。高级环境通常允许在生成页面时设置此类头。例如,在PHP环境中,您可以这样设置PDF资源的响应头:

php
header('Content-Type: application/pdf')

尝试仅使用header('application/pdf')设置它将不起作用。