我最近一直致力于一个小项目来提供静态文件。我希望能够提供不同类型的文件,例如:
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类型吗?为什么?
答案 0 :(得分:4)
您正在引用MIME RFC。但在this context中,Content-Type
受RFC 7231, section 3.1.1.5授权,其读取(强调我的):
生成包含有效负载正文的消息的发件人应该在该消息中生成Content-Type标头字段,除非发件人不知道所包含的表示的预期媒体类型。
实际上,如果省略此标题,您将离开客户端,对文件扩展名和magic bytes进行猜测。 Content-Type
标题优先于那些标题,并为客户节省了相当多的工作。
RFC的相关部分解决了以下问题:
这样做的客户可能会得出错误的结论,这可能会带来额外的安全风险(例如,“权限提升”)。此外,通过检查数据格式无法确定发送者的意图:许多数据格式匹配仅在处理语义方面不同的多种媒体类型。
答案 1 :(得分:2)
您必须设置mime类型。客户端确定它正在处理的数据类型很有用。与节点无关。这是http规范。