强制CloudFront从S3传递最新的HTML文件

背景

我在S3上托pipe一个静态站点,CloudFront位于顶部。 我的问题是我的HTML文件。

根据CloudFront的FAQ :

Amazon CloudFront使用这些caching控制标头来确定需要检查该文件的更新版本的来源的频率

我到目前为止所做的

考虑到这一点,我已经在我的S3桶中设置了HTML文件来添加下面的头文件:

Cache-Control: no-cache, no-store, max-age=0, must-revalidate Expires: Fri, 01 Jan 1990 00:00:00 GMT 

在我第一次调用我的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 

正如你所看到的,我的Cache-Control头在那里。 问题是,如果我更新这个文件并刷新,我得到caching的内容(而不是最新的文件),我可以看到CloudFront通过查看响应头来提供它的caching版本:

X-Cache:Hit from cloudfront

摘要/问题

考虑到上述情况,如何在使用CloudFront时自动检索最新的HTML?

根据它的常见问题,我应该可以用Cache-Control标题做到这一点,但我似乎无法得到这个工作。

下面的答案

最后,我决定将我的CNAME名称改为直接指向我的S3存储桶。 然后添加一个名为“static”的新CNAME,指向CloudFront。

这意味着HTML是直接从S3,它的所有CSS / JS / IMG引用指向static.mydomain.com

首先,Cloudfront的重点在于提供caching的内容 – 如果您尝试从Cloudfront提供未caching的内容,则比在S3中直接提供内容要慢,几乎在所有情况下(stream内容都是例外)。 考虑一下为了从Cloudfront提供内容而需要做什么 – 它需要从原始服务器检索到地理位置接近用户的位置 – 这意味着对于Cloudfront必须从原始服务器检索内容的请求,则会在请求中添加额外的延迟,并且用户接收内容的速度会变慢。 只有边缘位置的内容可用后续请求才会更快。

解决此问题的最佳方法是在更新页面时更改文件名 – 这将强制Cloudfront检索新内容。 再次,请记住,Cloudfront通常用于媒体文件(包括图像)和style / javascript – 而不是HTML。 从本质上讲,您可以在S3上使用HTML,在Cloudfront上使用您的图像 – 如果有任何更改,您可以更改Cloudfront上的文件名(例如file-v1.jpg,file-v2.jpg等)。 另一种常见的方式是包含带有版本信息的查询string。

此外,请记住,Cloudfront不提供gzip内容 – 这可能会导致响应速度低于常规服务器(尽pipe在您的情况下,S3并不能识别支持gzip的浏览器)。

最后,如果您愿意,可以使用失效来强制Cloudfront放弃其现有副本并从原始服务器获取新副本。 但是,请注意,Cloudfront每个月只能为您提供1000次免费失效,之后的费用为$ 0.005 /失效。

Cloudfront保留内容的最低时间为1小时 ,但默认为24小时。 因此,我想尽量设置最大年龄至less3600.也考虑一个s-maxage头(共享 – 即代理内容)。 亚马逊推荐这个caching教程。

最近有一个问题 ,前几天纠正了

我相信到目前为止的答案在当时是正确的,现在已经过时了,因为Cloudfront现在支持最小TTL为0,并且OP现在使用cache-age = 0的初始尝试现在应该可以工作。

您将需要考虑是否使用这些其他caching控制标题,就是否会产生您正在查找的结果而言 – 您可能只需要max-age。 您可能希望Cloudfront检查S3以查看HTML文件是否已更改。 如果有,Cloudfront可以获取并返回新文件。 如果没有,它可以从现有的caching服务客户端(节省S3带宽,并更快地为客户端服务,更本地)。

是的,Cloudfront的意义在于提供caching的内容,但是现在这包括有时会改变的内容,但是如果它没有改变,可以被caching。

Ps查询string现在也可以与Cloudfront一起使用(如果您为相关来源configuration了“行为” – 另一个新function),但是某些代理可能仍然无法使用查询stringcaching任何文件。

亚马逊开发人员指南:到期1

不确定CloudFront如何处理您的标题,但如果您未指定任何标题,则刷新对象的默认时间为24小时。

你可以做的事情之一是刷新对象是使内容失效。 看看下面的链接更多信息。 http://blog.cloudberrylab.com/2010/08/how-to-manage-cloudfront-object.html