2017-08-17 119 views
6

我有一个S3存储桶上托管的React应用程序。代码使用yarn build缩小(这是一个基于创建反应的应用程序)。该build文件夹看起来像:如何让CloudFront永不缓存S3存储桶上的index.html

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 

我再也不想index.html被缓存,因为如果我更新的代码(使进制后缀main.*.js更新),我需要的用户下次访问回暖的<script src>更改为index.html指向更新的代码。

在CloudFront中,我似乎只能排除路径,排除“/”似乎不能正常工作。我在更改代码时遇到了奇怪的行为,如果我刷新了,我会看到它,但如果我退出Chrome并返回,出于某种原因,我看到过时的代码。

我不想在每个代码版本(通过CodeBuild)触发无效。有没有其他的方法?我认为其中一个挑战是,由于这是一个使用React Router的应用程序,我必须通过将错误文档设置为index.html并强制HTTP状态200而不是403来做一些诡计。

回答

5

如果您从不想要要缓存index.html,请仅在该文件上设置Cache-Control: max-age=0标头。 CloudFront将向发出请求,回复您的原始S3存储桶请求,但听起来像这是期望的行为。

如果你想设置较长的到期时间和手动无效CloudFront的缓存,可以使用一个*/*作为无效路径(不/如你所提到的)。但是,对于全球所有CloudFront边缘节点来说,这可能需要长达15分钟的时间才能反映您原点的变化。

+0

你是在谈论在S3对象元数据中添加该头文件吗?而且,无论URL路径如何,我都不希望index.html缓存。我更关心缓存相关文件(JS文件,CSS,图像)。 – ffxsam

+0

是的:它在AWS文档中被称为“系统定义的元数据”:http://docs.aws.amazon.com/AmazonS3/latest/user-guide/add-object-metadata.html –

+2

很好,这是有帮助!在复制索引文件时,我已经设置了我的部署过程以使用'aws s3 cp --cache-control max-age = 0'。奇迹般有效。 – ffxsam