情景:
我将自定义源(我的服务器)的Cloudfront分发设置为逐行扫描的mp4视频文件列表。
这些文件循环播放并通过Chrome原生HTML5视频API播放。每次视频结束时Chrome都会向该文件发出另一个请求。
从我的服务器播放文件时,Chrome会返回
Status Code:206 Partial Content (from cache)
对每个请求,当从CloudFront播放相同的文件时, Chrome永远不会缓存该文件并在每次请求时继续下载!
这些是Chrome中Amazon CloudFront的响应标头:
HTTP/1.0 206 Partial Content
Date: Mon, 19 Mar 2012 19:47:44 GMT
Server: Apache
Last-Modified: Mon, 19 Mar 2012 12:35:37 GMT
ETag: "a78e87ba-335d8e-4bb97cb9f887f"
Accept-Ranges: bytes
Content-Type: video/mp4
Content-Range: bytes 4228-3366285/3366286
Content-Length: 3362058
Age: 3819
X-Cache: Hit from cloudfront
X-Amz-Cf-Id: xxxxxx
Via: 1.0 xxxxxx.cloudfront.net (CloudFront)
Connection: keep-alive
Chrome中与我的服务器(来源)相同的文件中的响应标头:
HTTP/1.1 206 Partial Content
Date: Mon, 19 Mar 2012 20:50:40 GMT
Server: Apache
Last-Modified: Mon, 19 Mar 2012 12:35:37 GMT
ETag: "a78e87ba-335d8e-4bb97cb9f887f"
Accept-Ranges: bytes
Content-Length: 3366286
Content-Range: bytes 0-3366285/3366286
Keep-Alive: timeout=2, max=256
Connection: Keep-Alive
Content-Type: video/mp4
我错过了什么吗?
可能原因是CloudFront响应中缺少Keep-Alive
标头?或者可能在不同的HTTP协议版本(1.0 vs 1.1)?
更新
我还添加了Expires和Cache-Controls标头,没有任何改变。令人遗憾的是,将HTML5视频api和Amazon CloudFront结合起来非常无用 危险。
来自Inspector的屏幕截图,您可以看到在每个循环上重新下载该文件: http://i.imgur.com/0VyZD.jpg
这是从本地服务器加载的文件的另一个屏幕截图: http://i.imgur.com/go1zN.jpg
更新2:
这似乎与CloudFront没有严格关系。经过各种测试后,Chrome似乎无法缓存视频
1)文件大于2Mb
2)Content-Range
标题不是从0开始(参见上面的不同示例)
我认为这只与本机HTML5视频API及其206部分内容状态有关。
答案 0 :(得分:9)
来自您的CloudFront响应:
HTTP / 1.0 206部分内容
HTTP / 1.0不包含206响应代码(在HTTP / 1.1中添加),因此chrome的缓存层拒绝重用响应。 http://crbug.com/128116中更多特定于chrome的详细信息,但简短的回答是CloudFront应该将206个响应作为HTTP / 1.1提供,而不是/1.0。
答案 1 :(得分:2)
没有指定expires / cache-control标头。 Chrome可以特别关注缓存项目(特别是当它们通过javascript动态添加到DOM时),如果没有提供过期标题。
http://code.google.com/speed/page-speed/docs/caching.html
来自谷歌:
为所有可缓存资源指定Expires或Cache-Control max-age以及Last-Modified或ETag之一非常重要。指定Expires和Cache-Control:max-age或指定Last-Modified和ETag都是多余的。