正确配置服务器 MIME 类型

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

MIME 类型示例

  • text/html 用于 HTML 文档。
  • text/plain 用于纯文本。
  • text/css 用于层叠样式表。
  • text/javascript 用于 JavaScript 文件。
  • text/markdown 用于 Markdown 文件。
  • application/octet-stream 用于需要用户操作的二进制文件。

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

2.2.7 之前的 Apache Web Server 版本配置为对于未知内容类型报告 text/plainapplication/octet-stream 的 MIME 类型。现代版本的 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,它将报告资源的内容类型。
  • 在页面源代码中查找一个<meta> 元素,该元素提供了 MIME 类型,例如 <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') 设置它将不起作用。