如何使CloudFront永远不会在S3存储桶上缓存index.html

ffx*_*sam 35 amazon-s3 amazon-web-services amazon-cloudfront

我在S3存储桶上托管了一个React应用程序.使用yarn build(这是一个基于create-react-app的应用程序)缩小代码.该build文件夹看起来像:

build
??? asset-manifest.json
??? favicon.ico
??? images
?   ??? map-background.png
?   ??? robot-icon.svg
??? index.html
??? js
?   ??? fontawesome.js
?   ??? packs
?   ?   ??? brands.js
?   ?   ??? light.js
?   ?   ??? regular.js
?   ?   ??? solid.js
?   ??? README.md
??? service-worker.js
??? static
    ??? css
    ?   ??? main.bf27c1d9.css
    ?   ??? main.bf27c1d9.css.map
    ??? js
        ??? main.8d11d7ab.js
        ??? main.8d11d7ab.js.map
Run Code Online (Sandbox Code Playgroud)

我永远不想index.html被缓存,因为如果我更新代码(导致十六进制后缀main.*.js更新),我需要用户下次访问以获取<script src>更改index.html以指向更新的代码.

在CloudFront中,我似乎只能排除路径,排除"/"似乎无法正常工作.我得到奇怪的行为,我更改代码,如果我打刷新,我看到它,但如果我退出Chrome和回去,我看到非常过时代码的某些原因.

我不想在每个代码版本上触发失效(通过CodeBuild).还有其他方法吗?我认为,挑战之一是,因为这是使用路由器作出反应的应用程序,我在用错误的文件设置为做一些挂羊头卖狗肉index.html,并迫使HTTP状态200,而不是403.

Luk*_*son 35

如果您不想index.html缓存,请Cache-Control: max-age=0仅在该文件上设置标题.CloudFront会在每次请求时向您的原始S3存储桶发出请求,但听起来这是期望的行为.

如果您希望设置更长的到期时间并手动使CloudFront缓存无效,则可以使用*/*作为失效路径(不是/您提到的那样).但是,全球所有CloudFront边缘节点最多可能需要15分钟来反映原点的变化.

  • 太好了,这很有帮助!我将部署过程设置为在复制索引文件时使用`aws s3 cp --cache-control max-age = 0`.奇迹般有效. (8认同)

sez*_*443 16

基于CloudFront配置的解决方案:

转到“行为”选项卡下的CloudFront分配,并创建新行为。指定以下值:

  • 路径模式:index.html
  • 对象缓存:自定义
  • 最大TTL:0(或另一个非常小的值)
  • 默认TTL:0(或另一个非常小的值)

保存此配置。

CloudFront将不再缓存index.html

  • 感谢您的反馈。我可以确认初始规则(“index.html”)适用于内部目录。我检查了cloudfront文档,基本上,它们的规则匹配文件名,即使在内部目录中,而不仅仅是根目录。 (4认同)
  • 如果其他人好奇的话:从 AWS CLI 实现这一点并不是很方便。 (3认同)
  • 我认为这个答案适用于“缓存和源请求设置”中的“使用旧版缓存设置”选项。如果您想通过选择“使用缓存策略和源请求策略”选项来使用现有的托管策略,我认为正确的值是“Managed-CachingDisabled” (3认同)
  • 您好@seza443,这对内部目录中的index.html 文件有效,还是仅对根目录中的文件有效? (2认同)
  • 如果您使用 CI/CD 解决方案并且您的 index.html 每次都会更新,则可以采用这种方法。恕我直言,它应该被接受为正确答案。 (2认同)

cha*_*mre 10

以下是我在将新文件上传到s3并使Cloudfront无效后,在我的index.html文件上设置缓存控制的命令:

aws s3 cp s3://bucket/index.html s3://bucket/index.html --metadata-directive REPLACE --cache-control max-age=0
Run Code Online (Sandbox Code Playgroud)