使用www重定向到裸域处理Cloudfront / S3网站的最佳方式

时间:2017-08-02 17:42:06

标签: amazon-web-services amazon-cloudfront

我有一个网站,我希望www-prefixed版本重定向到裸域。

在搜索了不同的解决方案之后,我在这里找到了这个封闭的主题,这个答案似乎很有效:https://stackoverflow.com/a/42869783/8406990

但是,我有一个问题,如果我在S3存储桶中更新根对象“index / html”,Cloudfront服务新版本可能需要一天时间。我甚至手动使文件无效,并且在正确更新“index.html”文件的同时,Cloudfront仍然提供旧文件。

为了更好地解释,如果我输入:http://mywebsite.com/index.html,它将提供新版本。但是如果我输入http://mywebsite.com/,它就会提供旧的index.html。

我继续在我的Cloudfront发行版的默认根对象属性中添加“index.html”(对于裸域),它立即按我的意愿工作。仅输入域名(不添加/index.html)就会返回新版本。

然而,这与我刚刚链接的线程中的答案形成对比,后者明确指出在使用两个分布进行重定向时不设置“默认根对象”。我希望更好地理解这个“默认根对象”,以及是否有更好的方法来确保根对象正确更新缓存版本?

谢谢。

1 个答案:

答案 0 :(得分:0)

如果您确实将index.html/作为默认根对象,并且您的CloudFront分配指向了存储桶的网站托管端点并且它正常工作,那么您几乎肯定会提供服务存储桶中的一个名为index.html /的对象,它将作为文件夹出现在您的存储桶中,或者在名为index.html的文件夹中出现在名为index.html的对象中。尾部斜杠不属于新的斜杠。这可能解释了这种奇怪的行为。但这也可能是你问题上的错字。

重要的是...... CloudFront的一个目的是最大限度地减少对后端的请求,并将副本缓存在地理位置接近经常请求的位置。在S3中更新对象不是设计来更新CloudFront立即服务的内容,除非您已将其配置为执行此操作。执行此操作的一种方法是在将对象元数据保存到S3时对其设置(例如)Cache-Control: public, max-age=600。这将告诉CloudFront永远不会提供从S3获得的对象的缓存副本超过600秒(10分钟)。如果您未设置此选项,默认情况下,CloudFront将不会立即检查24小时(“默认TTL”)。

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html

这仅适用于一个方向 - 它告诉CloudFront 允许保留缓存副本多长时间而不检查更新。它不会告诉CloudFront它必须等待那么久才能检查。 CloudFront可能会在其最大期限到期之前释放不经常请求的对象。下一个请求从S3获取新副本。

如果您需要立即从CloudFront的缓存中擦除对象,则称为缓存invalidation。对于您请求失效的每个路径(不是每个文件),这些费用为0.005美元,但每个AWS账户每月前1,000个的费用为0.00美元。您可以通过请求/*的无效来使您的所有文件无效。这使S3保持不变,但CloudFront会丢弃在失效请求之前缓存的任何内容。

默认根对象是遗留功能,自S3引入静态网站托管存储桶以来,通常不再需要这一功能。在此之前 - 如果您将CloudFront指向存储桶的REST端点 - 有人点击您网站的根目录会看到所有对象的列表。显然,这几乎总是不受欢迎的,因此默认的根对象允许您替换站点根目录的不同页面。

使用S3中的静态托管,您可以在站点的任何“目录”中使用索引文档,从而生成CloudFront选项 - 该选项仅适用于站点的根目录,而不适用于索引文档可用的任何位置。因此,现在使用此功能的情况相对较少。