text-plain的content-type导致浏览器下载文件

ste*_*918 13 http mime-types

我正在编写一个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
Run Code Online (Sandbox Code Playgroud)

如果我将content-type更改为"application-json",那么它将显示在所有浏览器上.此外,如果我将内容类型更改为"text/html",它也可以工作,即使我没有返回HTML文件.

有没有解释为什么text/plain表现这种方式?我检查确保返回的所有数据实际上都是ASCII,因为我将内容类型设置为text/plain,所以我很困惑为什么它被解释为application/octet-stream.

tri*_*nth 9

劳伦斯的解释是正确的.在此帖子发布时,只有IE和Chrome正在执行mime嗅探.你现在可以设置HTTP标头X-Content-Type-Options: nosniff,它就可以了!


Lau*_*ves 8

听起来您可能遇到Chrome Issue 106150.当内容类型是text/plain时,Chrome显然(有时)决定使用"嗅探"逻辑.

可能的解决方法:

  • 如果文本是Unicode,请包含BOM.这将告诉嗅探逻辑它真的是文本.
  • 从文件中删除"二进制查找"字节.从错误报告"0x00和0x1f之间的任何值看起来都是二进制,除了 ESC,CR,NP,NL,HT".
  • 这听起来像使用一个显然应该是text/plain(如.txt)的扩展可能会禁用嗅探.