You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

操作步骤:

  1. 将修改后的函数发布到生产环境
  2. 进入CloudFront响应头策略配置页面,删除自定义的Cache-Control头条目
  3. 更新分发配置并等待部署完成

方案2:限制响应头策略的作用范围

如果需要保留响应头策略,可修改其配置,让自定义Cache-Control仅对200状态码生效,这样非200状态码的响应不会被策略覆盖:

  • 打开CloudFront控制台的响应头策略编辑页面
  • 找到自定义Cache-Control的配置项,点击编辑
  • 添加状态码匹配条件:选择「等于」并输入200
  • 保存策略并更新分发配置

额外检查项

  • 确认函数绑定在Viewer Response阶段(而非Origin Response),只有该阶段的函数会处理返回给用户的最终响应
  • 确保函数已发布到生产环境,且分发关联的是最新版本的函数

内容的提问来源于stack exchange,提问作者Sflagg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:05:08