我有一个基于Node.js中标准的http
模块编写的Web服务器。它一直很好地为我服务,用于提供各种HTML、JavaScript、CSS和资产内容——这些自然组成了我的网页大部分。
当请求映射到没有已知扩展名的文件的URL时(没有进行MIME嗅探),它会简单地使用分块传输编码来提供内容,并使用头部字段Content-Type: application/octet-stream
。这也一直非常好地工作——我偶尔会在服务器上托管各种类型的文件,并能够按预期从application/octet-stream
处理中下载这些文件而不受用户代理的干扰。
然而,今天我尝试在运行iOS 9.3.5的iPhone 4S上的Safari移动浏览器中下载文件,结果它就是死活不下载,还提示我:
下载失败。Safari无法下载此文件。
我随后尝试添加了Content-Disposition: attachment
和 Content-Disposition: attachment; filename="foobar"
,以防万一,但它仍然拒绝下载。
这是发生在一个名为random
的文件上,其中填充了1000个随机字节。我的主机头部字段是(如上所述,Content-Disposition
是可选的):
HTTP/1.1 200 OK
Host: example.com
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="foobar"
Date: Mon, 01 May 2017 13:48:37 GMT
Connection: keep-alive
Transfer-Encoding: chunked
记录一下,Android 6.x手机也表现正常(除了我的Windows 10 x86_64主机上的Firefox 53之外),从URL下载没有问题。
Safari这里出了什么问题?