带有以下响应标头:
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 状态)时,它似乎不知道视频已完全下载。
我们目前找不到解决方案...