如果我不得不猜测,我会说区别在于 Apache 静态文件服务和 hgweb 提供的标头。这是来自 Apache 的静态文件服务的 .mp3 文件的输出:
$ HEAD -Ssed http://sgdk2.enigmadream.com/ben/iotaBuildIt/bing.mp3
HEAD http://sgdk2.enigmadream.com/ben/iotaBuildIt/bing.mp3
200 OK
Connection: close
Date: Wed, 23 May 2012 16:55:03 GMT
Accept-Ranges: bytes
ETag: "4d0cbbe-16c7-4bd83a906c040"
Server: Apache
Content-Length: 5831
Content-Type: audio/mpeg
Last-Modified: Thu, 12 Apr 2012 23:24:41 GMT
这里它来自 hgweb 的原始文件处理程序:
HEAD http://hg.code.sf.net/u/bluemonkmn/myiota/raw-file/97ac02a717fe/HTML/bing.mp3
200 Script output follows
Connection: close
Date: Wed, 23 May 2012 16:56:33 GMT
Server: Apache/2.2.3 (CentOS)
Content-Length: 5831
Content-Type: audio/mpeg
Content-Disposition: inline; filename="bing.mp3"
最大的区别在于 Apache 包含Accept-Ranges标头,而 hgweb 提供了Content-Disposition标头。
此处的Content-Disposition
标题仅向您的浏览器建议 saveAs 的默认文件名,因此它不太可能是罪魁祸首(但人们永远不知道)。
标题Accept-Ranges
更有趣。虽然它不是最初的目的,但它已成为寻求流式音频和视频播放的支柱。如果人们再次将播放视为寻找(寻找为零)的一种特殊情况,那么 Chrome 可能正在禁用它,因为没有Accept-Ranges
标题它认为它根本无法寻找(当然,寻找零只是在播放再次从零开始)。
这绝对只是吐痰,但它很容易测试。调整 hgweb 的 apache 主机以使用mod_headers,如下所示:
header add Accept-Ranges bytes
在运行您的路径中hgweb
(无论是 wsgi 还是 cgi)。当您使用它时,您也可以删除Content-Disposition
标题mod_headers
。
最后,这一切都与线路上的字节有关。您可以让 hgweb 和 Apache 返回完全相同的字节,然后 Chrome会以相同的方式处理它。
注意:当然,将Accept-Ranges: bytes
标头添加到 hgweb 的输出实际上并没有为 hgweb 添加字节范围支持,但这没关系。hgweb 只会忽略Range: bytes=xxxx
标头,而不是给出206 Partial Response
状态,它会给出 a200 OK
并且 RFC 说需要客户端(Chrome)来处理它。因此,您将无法跳过文件,但 Chrome 可能足以让您搜索开始/重播。