我使用 Nginx 托管了一个 2.9MB 的 MP3 文件。当我使用 Android 上的 Chrome 导航到其 URL 时,会发出两个请求:一个正常请求和一个两字节范围请求。
当我将第一个请求复制为 cURL 命令并在 Mac OS X 上执行时,它会下载整个文件。然而,在 Android 上,在触发两字节范围请求之前,只下载了 3.7 KB。Nginx 只响应了两个字节的数据,Chrome 中显示的音频控件无法使用。
我尝试过设置max_ranges 0
、禁用 etags、gzip 等。但似乎无法让 Chrome 下载文件的其余部分。
第一个请求:
GET /yt/test.mp3 HTTP/1.1 Host: xxx.xxx.xx.xxx Connection: keep-alive Pragma: no-cache Cache-Control: no-cache Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Linux; Android 6.0.1; Nexus 6P Build/MMB29Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.95 Mobile Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: en-US,en;q=0.8
回复:
HTTP/1.1 200 OK Server: nginx Date: Mon, 15 Feb 2016 01:12:31 GMT Content-Type: audio/mpeg Content-Length: 2891369 Last-Modified: Mon, 15 Feb 2016 00:26:18 GMT Connection: keep-alive ETag: "56c11b2a-2c1e69" X-Frame-Options: SAMEORIGIN X-Content-Type-Options: nosniff X-XSS-Protection: 1; mode=block Accept-Ranges: bytes
第二个请求:
GET /yt/test.mp3 HTTP/1.1 Host: xxx.xxx.xx.xxx Connection: keep-alive Pragma: no-cache Cache-Control: no-cache User-Agent: Mozilla/5.0 (Linux; Android 6.0.1; Nexus 6P Build/MMB29Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.95 Mobile Safari/537.36 Accept: */* Referer: https://xxx.xxx.xx.xxx/yt/test.mp3 Accept-Encoding: gzip, deflate, sdch Accept-Language: en-US,en;q=0.8 Range: bytes=0-1
回复:
HTTP/1.1 206 Partial Content Server: nginx Date: Mon, 15 Feb 2016 01:12:32 GMT Content-Type: audio/mpeg Content-Length: 2 Last-Modified: Mon, 15 Feb 2016 00:26:18 GMT Connection: keep-alive ETag: "56c11b2a-2c1e69" X-Frame-Options: SAMEORIGIN X-Content-Type-Options: nosniff X-XSS-Protection: 1; mode=block Content-Range: bytes 0-1/2891369
答案1
好的,可以肯定问题是 Chrome 将媒体获取和播放卸载到 Android MediaPlayer。就我的情况而言,我没有正确设置 SSL 证书(因为我的域名被我的注册中心暂时错误地列入黑名单)。我可以手动点击 Chrome 中的安全警告以进入该页面,但我认为一旦 MediaPlayer 尝试接管获取资源,它就会因为证书错误而放弃。
不能 100% 确定这是问题所在,但我的域名已恢复服务,一切正常。当我使用原始 IP 地址时,我可能可以通过禁用 HTTPS 来避免一些麻烦。