Http 纯文本的内容类型导致浏览器下载文件

Http 纯文本的内容类型导致浏览器下载文件,http,mime-types,Http,Mime Types,我正在编写一个web应用程序API,当有人访问URL时,它返回文本数据。我将内容类型设置为“text/plain”,但当我使用Chrome访问它时,它会下载一个包含信息的文件,而不是显示它。当我使用IE访问它时,它会正确显示,当我使用Firefox访问它时,它会说它正在尝试访问应用程序/八位字节流,并询问我是否要下载该文件 我使用TinyHTTPProxy记录了web服务器返回的内容,如下所示: [2012-03-11 16:51:45.345] INFO {TinyHTTPProxy

我正在编写一个web应用程序API,当有人访问URL时,它返回文本数据。我将内容类型设置为“text/plain”,但当我使用Chrome访问它时,它会下载一个包含信息的文件,而不是显示它。当我使用IE访问它时,它会正确显示,当我使用Firefox访问它时,它会说它正在尝试访问应用程序/八位字节流,并询问我是否要下载该文件

我使用TinyHTTPProxy记录了web服务器返回的内容,如下所示:

[2012-03-11 16:51:45.345] INFO     {TinyHTTPProxy Thread-4} HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
Connection: close
Date: Mon, 05 Mar 2012 09:49:54 GMT
Server: localhost


[2012-03-11 16:51:45.345] INFO     {TinyHTTPProxy Thread-4} 10b
P,FIO,7,31.5900,0.,,0,100,0,0,30.7600,31.9600,100,1000,,,0.,16:03:14t,,0,31.5900    ,1.2,,,15,n,,,,,03/09/2012,,31.2200,,,,-0.37,-0.37,0.274456994,,,,,0,,2846732.85    ,14,4,,3989502,BSE-CSE-NYSE-PSE-NMS,,,,,0,,,0,1155872,N,,26,26,26,16:03:14,5-7-10-11-12-13-18-25-26-28-80,0
如果我将内容类型更改为“applicationjson”,那么它将显示在所有浏览器上。此外,如果我将内容类型更改为“text/html”,它也可以工作,即使我没有返回html文件


有没有解释为什么text/plain会这样做?我检查以确保返回的所有数据实际上都是ASCII,并且由于我将内容类型设置为文本/纯文本,我不明白为什么它被解释为应用程序/八位字节流。

听起来您可能遇到了。当内容类型为文本/普通时,Chrome显然(有时)决定使用“嗅探”逻辑

可能的解决办法:

  • 发送
    X-Content-Type-Options:nosniff
    标题
  • 如果文本为Unicode,请包含BOM表。这将告诉嗅探逻辑它实际上是文本
  • 从文件中删除“看起来像二进制”的字节。从错误报告“0x00和0x1f之间的任何值看起来都是二进制的,除了ESC、CR、NP、NL、HT”
  • 听起来使用一个显然应该是text/plain(比如.txt)的扩展可能会禁用嗅探

劳伦斯的解释是正确的。在撰写本文时,只有IE和Chrome在执行mime嗅探。现在,您只需设置HTTP头
X-Content-Type-Options:nosniff
,它就可以完成这个任务了

有趣的是,谢谢你提供的信息,我没有意识到浏览器会嗅探数据来尝试做一些更智能的事情。谢谢你。我当时正绞尽脑汁想弄明白为什么Chrome坚持下载UTF-8文本/普通文件,结果发现里面有两个0x02实例。Chrome只会嗅探前x字节(可能是1KB)中的二进制字节,这可能会导致不可预测的结果——有时我在前1KB中有看起来像二进制的字节,有时在进行一些调查性打印调用时没有。请参阅@trinth的答案以了解当前解决方案。