CloudFront函数设置Cache-Control不生效,响应头被分发配置覆盖
问题分析与解决方案
核心结论
是的,响应头策略的自定义Cache-Control优先级高于CloudFront Viewer Response函数设置的值。CloudFront的执行顺序是先运行Viewer Response函数,再应用响应头策略,因此策略中定义的头字段会直接覆盖函数设置的对应内容,这就是你当前函数配置未生效的原因。
具体解决方法
方案1:统一通过CloudFront函数管理所有Cache-Control规则
移除响应头策略中的自定义Cache-Control配置,把200状态码的缓存规则也整合到函数中,确保所有状态码的缓存逻辑由函数统一处理:
var DEBUG = true; function logToConsole(message, force) { if (DEBUG || force !== undefined) console.log(message); } var cacheControlHeaders = { 200: 'max-age=604800, s-maxage=2592000', 404: 'max-age=300', 403: 'max-age=0', 400: 'max-age=0', 500: 'max-age=0', 503: 'max-age=0', 504: 'max-age=0' }; function handler(event) { logToConsole(event); try { var statusCode = event.response.statusCode; logToConsole(statusCode); if (cacheControlHeaders.hasOwnProperty(statusCode)) { var cacheControlValue = cacheControlHeaders[statusCode]; logToConsole(`Setting Cache-Control for ${statusCode} response`); event.response.headers['cache-control'] = { value: cacheControlValue }; } } catch (error) { logToConsole(error, true); } return event.response; }
操作步骤:
- 将修改后的函数发布到生产环境
- 进入CloudFront响应头策略配置页面,删除自定义的Cache-Control头条目
- 更新分发配置并等待部署完成
方案2:限制响应头策略的作用范围
如果需要保留响应头策略,可修改其配置,让自定义Cache-Control仅对200状态码生效,这样非200状态码的响应不会被策略覆盖:
- 打开CloudFront控制台的响应头策略编辑页面
- 找到自定义Cache-Control的配置项,点击编辑
- 添加状态码匹配条件:选择「等于」并输入
200 - 保存策略并更新分发配置
额外检查项
- 确认函数绑定在Viewer Response阶段(而非Origin Response),只有该阶段的函数会处理返回给用户的最终响应
- 确保函数已发布到生产环境,且分发关联的是最新版本的函数
内容的提问来源于stack exchange,提问作者Sflagg
相关产品推荐
相关产品推荐

