【问题标题】:Is a MIME header declaration good practice?MIME 标头声明是好的做法吗?
【发布时间】:2016-09-03 10:29:16
【问题描述】:

我最近一直在做一个提供静态文件的小项目。我希望能够提供不同类型的文件,例如:

html, jpg, png, pdf, doc...

所有文件似乎都可以在不同的浏览器中正确呈现,而无需指定 MIME 类型。

例如,如果我提供一个图像并声明一个 MIME 类型,我会在我的 node.js 代码中写下这个:

response.writeHead(200, {'Content-Type': 'image/jpg'});
response.end(data);

忽略 MIME 类型将在不同的浏览器中呈现完全相同的结果:

response.writeHead(200);
response.end(data);

据我了解,如果标头中没有声明 MIME 类型,浏览器会尽力解决。

根据HTTP specifications,'Content-Type' 标头不是必需的。

与所有多部分 MIME 类型一样,每个部分都有一个可选的 “Content-Type”,默认为 text/plain。

我应该为每个响应声明一个 MIME 类型吗?为什么?

【问题讨论】:

  • 您指向的规范的那部分(顺便说一句已被 rfc7578 废弃)是关于从客户端角度进行的多部分形式编码。您的问题似乎是关于服务器是否应包含 Content-Type 标头。哪些是不相关的主题。
  • 这与 JavaScript 或 Node.js 无关。服务器如何实现并不重要。

标签: http http-headers mime-types mime


【解决方案1】:

您引用的是 MIME RFC。但在this context 中,Content-TypeRFC 7231, section 3.1.1.5 的授权,其内容为(强调我的):

生成包含有效负载正文的消息的发送者应该在该消息中生成 Content-Type 标头字段除非发送者不知道封闭表示的预期媒体类型

实际上,如果您省略此标头,您将让客户端对文件扩展名和magic bytes 进行猜测。 Content-Type 标头将优先于这些标头并为客户端节省大量工作。

RFC 的相关部分对此进行了如下说明:

这样做的客户可能会得出错误的结论,这可能会带来额外的安全风险(例如,“特权升级”)。此外,不可能通过检查数据格式来确定发送者的意图:许多数据格式匹配多种媒体类型,这些媒体类型仅在处理语义上有所不同。

【讨论】:

    【解决方案2】:

    您必须设置 MIME 类型。客户端确定它正在处理的数据类型很有用。与节点无关。它是 http 规范。

    【讨论】:

    猜你喜欢
    • 2012-07-27
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 2019-08-04
    • 2011-02-28
    • 1970-01-01
    相关资源
    最近更新 更多