浏览器(Chrome)不会缓存来自CloudFront的资产

时间:2012-03-19 21:38:50

标签: apache google-chrome amazon-cloudfront

情景:

我将自定义源(我的服务器)的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部分内容状态有关。

2 个答案:

答案 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都是多余的。