2017-08-02 81 views
0

我有一个网站,我希望www-prefixed版本重定向到裸露的域名。最好的方法来处理与www重定向到裸露域名的Cloudfront/S3网站

寻找不同的解决方案之后,我发现这个封闭这个答案在这里的话题,似乎工作的伟大:https://stackoverflow.com/a/42869783/8406990

不过,我在那里,如果我在更新根对象“指数/ HTML”的问题我S3存储桶,Cloudfront可能需要一天时间才能提供新版本。我甚至手动使文件无效,并且正确地更新了“index.html”文件,但Cloudfront仍旧服务于旧文件。

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

我继续在我的Cloudfront发行版的默认根对象属性(针对裸露域)中添加“index.html”,并立即按照我的意愿工作。只在域中输入(不添加/index.html)即可返回新版本。

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

谢谢。

回答

0

如果你真的把index.html/作为默认的根对象和您的CloudFront的分布指着水桶的网站托管端点和它的工作,那么你几乎可以肯定的服务在你的水桶称为索引的对象。 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选项 - 只能在网站的根目录下工作,而不能在索引文档的任何位置使用。所以现在使用这个功能比较少见。

+0

感谢您的回复。我其实确实犯了一个错字。在我的Cloudfront设置中,我放入了“index.html”,没有结尾的斜杠。我仍然想知道为什么我的失效行不通。尽管在index.html上做了失效,但我仍然无法在12小时后加载新的index.html文件。除非我明确地将index.html输入到url中。太奇怪了,放入默认的根对象实际上解决了我的问题。 – oneleaf

+0

@oneleaf哦,我看到了问题,然后......你需要使'/'无效,而不是'/ index.html'(当发送失效时,如果没有包含,控制台默默地添加一个前导斜杠,这样将与无效的index.html一样)。失效与浏览器请求的内容不符,而不是实际提供的内容,如果它们不同。 –

+0

非常感谢!这工作。我刚刚删除了我的发行版上的默认根对象设置。做了更新。在/创建了一个失效,它立即反映了变化。很高兴得到这个谜题整理出来! – oneleaf