如何配置CloudFront发送指定缓存头并缓存S3文件仅手动失效?
完全可行!你可以通过CloudFront的缓存策略和响应头策略分开配置,实现「CloudFront长期缓存文件,仅在你手动触发失效时才去S3拉取更新;同时给终端用户返回你要求的严格缓存控制头」的效果。具体步骤如下:
具体实现步骤
1. 配置CloudFront自身的缓存规则(让它长期缓存,不主动刷新)
你需要创建一个自定义缓存策略(Cache Policy),设置CloudFront对该文件的缓存时长为一个很大的值(比如1年,即31536000秒):
- 登录CloudFront控制台,进入「缓存策略」页面,点击「创建缓存策略」
- 在「缓存设置」里,将「默认TTL」「最小TTL」「最大TTL」都设为31536000
- 确保开启「忽略来自源的 Cache-Control 头」(或在策略设置中选择优先使用CloudFront的TTL而非源站的),这样即使S3对象有缓存头,CloudFront也会遵循自己的长期缓存规则,不会主动去S3拉新文件
2. 配置返回给用户的响应头(强制客户端不缓存)
接下来创建一个自定义响应头策略(Response Headers Policy),让CloudFront给用户返回你需要的Cache-Control头:
- 进入CloudFront控制台的「响应头策略」页面,点击「创建响应头策略」
- 在「自定义HTTP响应头」部分,点击「添加自定义HTTP响应头」
- 头名称填
Cache-Control,头值填max-age=0, no-store, no-cache, must-revalidate - 设置「覆盖」为开启,这样即使S3返回了其他
Cache-Control值,CloudFront也会用这个值返回给用户
3. 关联策略到CloudFront分发行为
找到你的CloudFront分发,进入「行为」标签页,编辑对应文件(比如/index.html)的行为:
- 在「缓存策略」下拉框中选择你刚才创建的自定义缓存策略
- 在「响应头策略」下拉框中选择你创建的自定义响应头策略
- 保存更改
4. 后续更新流程
当你在S3更新了index.html后,手动触发CloudFront缓存失效:
- 在CloudFront分发的「失效」标签页,点击「创建失效」
- 在「路径」中填写
/index.html(如果有多个文件可以用通配符,比如/*) - 提交失效请求,CloudFront会在几分钟内清除对应路径的缓存,下次请求时就会去S3拉取新文件,然后重新缓存一年
关键原理说明
CloudFront的缓存逻辑分为两个独立层面:
- 自身缓存层:由缓存策略控制,决定CloudFront多久会主动去源站(S3)拉取新内容
- 客户端缓存层:由响应头策略控制,决定终端用户的浏览器/客户端如何缓存内容
通过分开配置这两个策略,你就能实现:CloudFront自己长期缓存文件(减少S3请求),但强制用户每次都向CloudFront发起请求,而CloudFront只有在你手动失效后才会更新缓存的内容。
注意事项
- 缓存失效请求:CloudFront每月前1000次失效请求免费,超出部分按次数收费,成本很低
- 确保S3对象元数据不要设置
Cache-Control(如果设置了,也要确保CloudFront的缓存策略会忽略它),避免影响CloudFront的自身缓存逻辑 - 如果你的分发有多个行为,记得只给需要这个规则的路径(比如
/index.html)关联对应的策略,不要影响其他不需要严格控制的文件
内容的提问来源于stack exchange,提问作者tibo
相关产品推荐
相关产品推荐

