我在S3上使用我的文件在cloudfront中创建了一个发行版。 它工作正常,我的所有文件都可用。但是今天我在S3上更新了我的文件并尝试通过Cloudfront访问它们,但它仍然提供了旧文件。
我错过了什么?
答案 0 :(得分:6)
您应该在CloudFront分配缓存中使对象无效。 回到过去,你必须一次做1个文件,现在你可以用它做通配符,例如/图像/ *
答案 1 :(得分:5)
碰到同样的问题。最初,我尝试将更新后的S3存储桶中的文件的缓存控件更新为0,将max-age = 0更新为
。按照@jpaljasma的步骤进行的工作是什么。这是一些屏幕截图的步骤。
首先转到您的AWS CloudFront服务。
在“对象路径”文本字段中,您可以列出特定文件,即/index.html
,或仅使用通配符/*
来使所有文件无效。这迫使Cloudfront从S3存储桶中的所有内容中获取最新信息。
在文本字段中填写完后,单击“无效”,CloudFront完成无效后,您下次访问该网页时将看到更改。
答案 2 :(得分:4)
如何通过AWS S3控制台更改Cache-Control max-age:
Properties
Metadata
Key
的{{1}},请点击Cache-Control
。 Add more metadata
设置为Key
,将Cache-Control
设置为Value
(其中0是您希望文件保留在缓存中的秒数)。你可以用你想要的任何东西替换0。答案 3 :(得分:4)
使用CloudFront的主要优点是从源(在您的情况下为S3)获取文件并将其存储在边缘服务器上,以更快地响应GET请求。对于每个http请求,CloudFront都不会返回到S3源。
要让CloudFront提供最新的字段/对象,您有多种选择:
您可以使用CloudFront手动或使用触发器来使一个或多个文件或目录无效。此选项已在此处的其他响应中进行了描述。有关更多信息,请访问Invalidate Multiple Objects in CloudFront。如果您不经常更新文件并且不想影响缓存对象的性能优势,则此方法非常方便。
这是现在推荐的解决方案。很简单:
我将这两种方法结合使用,以确保将更新快速传播到边缘位置,并避免提供由CloudFront管理的过时文件。
但是,AWS建议通过在每个文件名中使用版本标识符来更改对象名。如果您使用构建命令并编译文件,则通常可以使用该选项(如react npm build命令中一样)。
答案 4 :(得分:1)
我也遇到了类似的问题,发现它真的很容易在您的Cloudfront发行版中修复
第1步。
登录到您的AWS账户并选择您的目标分配,如下图所示
第2步。
选择分发设置并选择行为标签
第3步。
选择
Edit
并根据下图选择选项 全部
第4步。
保存设置就可以了
答案 5 :(得分:0)
请参考此答案,这可能会对您有所帮助。
What's the difference between Cache-Control: max-age=0 and no-cache?
答案 6 :(得分:0)
我也遇到了这个问题,并通过使用版本控制(与S3版本控制不同)解决了该问题。这是在Cloudfront中使用版本控制的完整链接
当您将一个或多个新文件上载到S3存储桶时,请更改版本并根据需要更新链接。从文档中可以看出,使用版本控制与使无效(另一种方法)的好处是,通过版本更改刷新CloudFront无需支付任何额外费用,而具有无效即可。如果您有数百个文件,这可能会出现问题,但是可能通过将版本添加到根目录或默认的根对象(如果适用)中就不会有问题。就我而言,我有一个SPA,我所要做的就是更改默认根对象的版本(将index.html更改为index2.html),它会立即在CloudFront上更新。
答案 7 :(得分:0)