【问题标题】:content-type of text-plain causes browser to download of filetext-plain 的内容类型导致浏览器下载文件
【发布时间】:2012-03-28 11:10:29
【问题描述】:

我正在编写一个 Web 应用程序 API,当有人访问 URL 时,它会返回文本数据。我将内容类型设置为“文本/纯文本”,但是当我使用 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

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

有没有解释为什么 text/plain 会这样?我检查以确保返回的所有数据实际上都是 ASCII,并且由于我将内容类型设置为 text/plain,我很困惑为什么它被解释为 application/octet-stream。

【问题讨论】:

    标签: http mime-types


    【解决方案1】:

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

    可能的解决方法:

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

    【讨论】:

    • 有趣,感谢您的信息,我没有意识到浏览器会嗅探数据以尝试做更智能的事情。
    • 谢谢。我一直在努力弄清楚为什么 Chrome 坚持要下载 UTF-8 文本/纯文本文件,结果发现其中有两个 0x02 实例。
    • Chrome 只会嗅探前 x 字节(可能是 1KB)的二进制字节,这可能会导致无法预测 - 有时我在前 1KB 中有二进制字节,有时我没有做一些调查性的 print_r 电话。有关当前解决方案,请参阅@trinth 的答案。
    【解决方案2】:

    劳伦斯的解释是正确的。在本文发布时,只有 IE 和 Chrome 正在执行 mime 嗅探。您现在只需设置 HTTP 标头 X-Content-Type-Options: nosniff 就可以了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-06
      • 2018-09-01
      • 2021-08-20
      • 2013-06-26
      • 2011-06-08
      相关资源
      最近更新 更多