Chrome 不缓存 CloudFront 视频/音频;CloudFront 提供 http 1.0 标头

Chrome 不缓存 CloudFront 视频/音频;CloudFront 提供 http 1.0 标头

带有以下响应标头:

HTTP/1.0 200 OK
Content-Type: video/mp4
Content-Length: 3294545
Connection: keep-alive
Date: Thu, 30 May 2013 21:17:34 GMT
x-amz-meta-s3cmd-attrs: uid:501/gname:staff/uname:americanyak/gid:20/mode:33
    152/mtime:1368215923/atime:1369948577/ctime:1
    369948245
Cache-Control: no-transform,public,max-age=31536000,s-maxage=31536000
Expires: Fri, 30 May 2014 00:00:00 GMT
Last-Modified: Thu, 30 May 2013 21:16:39 GMT
ETag: "b524b3f434581a1c2daff863cf201540"
Accept-Ranges: bytes
Server: AmazonS3
Age: 1309
Via: 1.0 33c069541cbb3f6e68de8056c044d86e.cloudfront.net (CloudFront)
X-Cache: Hit from cloudfront
X-Amz-Cf-Id: oeZ3EzRFAZggWpgqIbObtJH_MdyrGLMsdxUU3amupI5rkq7sbXPt4A==

我遗漏了什么?为什么这不是缓存?

答案1

https://forums.aws.amazon.com/thread.jspa?threadID=124998

你好,

虽然我们已意识到范围请求 HTTP/1.0 206 响应和 Chrome 存在问题,但我们无法提供修复的预计时间。由于此问题特定于范围请求,因此,如果在您的用例中可以做到,立即的解决方法是禁用源服务器上的范围请求。

还值得一提的是,多年来,多家 Web 代理和缓存应用程序供应商已将 HTTP/1.0 作为事实上的标准,因此您可能会偶尔从使用 Chrome 的最终用户那里收到类似的报告,但不会从 Firefox 或 Safari 等其他浏览器收到此类报告。例如,以下是流行的 Squid Web 缓存邮件列表中的一位 Chrome 开发人员关于类似报告的讨论: http://www.squid-cache.org/mail-archive/squid-dev/201204/0113.html 我并不是说总是返回 HTTP/1.0 会永远存在,但在当今的现实世界中这相当常见。

我们正在努力修复未来问题。

问候,

马特·J

答案2

我能够通过禁用ETag原始服务器上的标头来解决该问题。

ETag由于某种原因,CloudFront 不喜欢引用。

到目前为止,通过 CloudFront 发送带有文件Range标头的请求video/mp4会导致返回整个对象,200 OK而不是206 Partial Content客户端发送If-Range带有缓存ETag引用的标头。

从原始服务器中删除ETag标头可以有效解决该问题,因为客户端将不再发送,并且 CloudFront 将按预期If-Range返回。206 Partial Content

此外,它还可以防止缓存未命中(X-Cache: Miss from cloudfront),从而节省带宽并加快 CDN 请求。

以下是使用 Express 4 处理静态文件的方法:

// Allow access to site folder
app.use( express.static('./site', { etag: false } ) );

答案3

我当时使用当前版本的 Chrome 时也遇到了类似的问题。我们遇到的主要问题是 Chrome 不会缓存托管在 s3 上并由 Cloudfront 提供的视频。我解释一下,我们使用的是 HTML5 原生视频播放器,我们使用了自动播放和循环播放功能。视频播放结束后,Chrome 会从 Cloudfront 请求视频,而不是从磁盘的缓存中获取。

我们注意到两件事,Firefox 不会发生此问题。而且,一些在 VPS 上托管视频的网站在我们使用 Chrome 时不会遇到同样的问题。

我们认为,问题发生在当 chrome 请求部分数据从 Cloudfront 流式传输视频(206 状态)时,它似乎不知道视频已完全下载。

我们目前找不到解决方案...

相关内容