浏览器(Chrome)无法缓存来自CloudFront的资产

8

场景:

我从自定义源(我的服务器)设置了一个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)?

2个回答

9

从您的CloudFront响应中:

HTTP/1.0 206部分内容

HTTP/1.0不包含206响应代码(该代码是在HTTP/1.1中添加的),因此Chrome的缓存层拒绝重用该响应。更多关于Chrome的详细信息,请参见http://crbug.com/128116,但简短回答是CloudFront应该将206响应作为HTTP/1.1而不是/1.0进行服务。


FTR,已在https://forums.aws.amazon.com/thread.jspa?threadID=96247向AWS CF报告。 - Ami
2
有没有客户端的解决办法?我讨厌我的所有视频都无法缓存。 - Stavros Korokithakis
参见:https://forums.aws.amazon.com/thread.jspa?threadID=124998 - arxpoetica

2
没有指定过期/缓存控制头。如果没有提供过期头,Chrome对缓存项(特别是通过JavaScript动态添加到DOM中的项)会非常挑剔。

http://code.google.com/speed/page-speed/docs/caching.html

来自Google:

对于所有可缓存资源,重要的是指定Expires或Cache-Control max-age之一以及Last-Modified或ETag之一。同时指定Expires和Cache-Control: max-age或同时指定Last-Modified和ETag是冗余的。


当从本地服务器和亚马逊服务器提供文件时,文件周围的其他项目是否相同?也许缓存启发式算法会根据与文件一起包含的相邻内容来评估要执行的操作。 - javram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接