isN*_*247 14 amazon-s3 amazon-cloudfront amazon-web-services
我在 S3 上托管一个静态站点,顶部是 CloudFront。我的问题是我的 HTML 文件。
Amazon CloudFront 使用这些缓存控制标头来确定检查源文件更新版本的频率
考虑到这一点,我已将 S3 Bucket 中的 HTML 文件设置为添加以下标头:
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Run Code Online (Sandbox Code Playgroud)
在我第一次调用 my 时samplefile.htm
,我看到以下响应标头(Content-Type
为了保持重点,我已经排除了明显的标头(例如):
Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Date:Sat, 10 Dec 2011 14:16:51 GMT
ETag:"a5890ace30a3e84d9118196c161aeec2"
Expires:Fri, 01 Jan 1990 00:00:00 GMT
Last-Modified:Sat, 10 Dec 2011 14:16:43 GMT
Server:AmazonS3
X-Cache:Miss from cloudfront
Run Code Online (Sandbox Code Playgroud)
如您所见,我的Cache-Control
标题在那里。问题是,如果我更新此文件并刷新,我将获得缓存内容(而不是最新文件),并且我可以通过查看响应标头看到 CloudFront 正在提供其缓存版本:
X-Cache:Hit from cloudfront
综上所述,在使用 CloudFront 时,如何实现自动检索最新的 HTML?
根据它的常见问题解答,我应该能够使用 Cache-Control 标头来做到这一点,但我似乎无法做到这一点。
最后我决定将我的 www CNAME 更改为直接指向我的 S3 存储桶。然后添加了一个名为“static”的新 CNAME,它指向 CloudFront。
这意味着 HTML 直接来自 S3,然后它的所有 CSS/JS/IMG 引用都指向 static.mydomain.com
小智 20
我相信到目前为止的答案虽然在当时是正确的,但现在已经过时了,因为 Cloudfront 现在支持最小 TTL 为 0,并且 OP 最初尝试使用 cache-age=0 现在应该可以工作了。
您可能想要查看是否使用其他缓存控制标头,根据它们是否会产生您正在寻找的结果 - 您可能只需要 max-age。您可能希望 Cloudfront 检查 S3 以查看 HTML 文件是否已更改。如果有,Cloudfront 可以获取并返回新文件。如果没有,它可以从其现有的缓存中为客户端提供服务(节省 S3 带宽,并在本地更快地为客户端提供服务)。
Cloudfront 的重点是提供缓存内容,是的,但现在这包括有时会更改的内容,但如果未更改,则可以缓存。
Ps 查询字符串现在也适用于 Cloudfront(如果您为相关源配置了“行为” - 另一个新功能),但是某些代理可能仍然无法缓存任何带有查询字符串的文件。
亚马逊开发人员指南:到期1
首先,Cloudfront 的重点是提供缓存内容 - 如果您尝试从 Cloudfront 提供未缓存的内容,它比直接从 S3 提供服务要慢,几乎在所有情况下(例如流媒体内容除外)。考虑一下从 Cloudfront 提供内容需要发生什么 - 需要从源服务器检索到地理位置靠近用户的位置 - 这意味着对于 Cloudfront 必须从源服务器检索内容的请求,您在请求中添加了额外的延迟,用户接收内容的速度会变慢。只有当内容在边缘位置可用时,后续请求才会更快。
解决此问题的最佳方法是在更新页面时更改文件名 - 这将强制 Cloudfront 检索新内容。同样,请记住,Cloudfront 通常用于媒体文件(包括图像)和样式/javascript - 而不是用于 html。本质上,您将在 S3 上拥有您的 HTML,在 Cloudfront 上拥有您的图像 - 进行任何更改后,您都可以更改 Cloudfront 上的文件名(例如 file-v1.jpg、file-v2.jpg 等)。另一种常见的方法是包含一个带有版本信息的查询字符串。
另外,请记住,Cloudfront 不提供 gzip 压缩的内容 - 这可能导致响应比常规服务器慢(尽管在您的情况下,S3 也无法识别支持 gzip 的浏览器)。
最后,如果您愿意,您可以使用失效来强制 Cloudfront 丢弃其现有副本并从源服务器获取新副本。但是请注意,Cloudfront 每月仅为您提供 1000 次免费失效,之后费用为 0.005 美元/失效。
Cloudfront 保留内容的最短时间为1hr,但默认为 24 小时。因此,我会尝试将 max-age 设置为至少 3600。还要考虑 s-maxage 标头(对于共享 - 即代理内容)。亚马逊推荐这个缓存教程。
有一个最近的问题与此,整流前几天
归档时间: |
|
查看次数: |
22487 次 |
最近记录: |