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

CloudFront与Lambda Edge适配新缓存行为失败,旧缓存行为可正常运行

CloudFront新缓存行为下Lambda@Edge路径修改失效问题排查与解决

问题背景

此前使用旧版CloudFront缓存行为,搭配Lambda@Edge修改源路径,实现单S3存储桶托管多站点。旧缓存行为下Lambda代码运行正常,但切换至新缓存行为后,配置无法正常工作。

原Lambda@Edge代码

'use strict';                 
const env = '${Environment}';
const origin_hostname = 'yourwebsite-${Environment}.s3.amazonaws.com';

exports.handler = (event, context, callback) => {
    const request = event.Records[0].cf.request;
    const headers = request.headers;
    const host_header = headers.host[0].value;
    var remove_suffix = '.yourwebsite.com';

    if(env == "dev"){
      remove_suffix = '-dev.yourwebsite.com';
    }                   
    
    if(host_header.endsWith(remove_suffix))
    {   
        request.uri = '/' + host_header.substring(0,host_header.length - remove_suffix.length) + request.uri;
    }
    
    // fix the host header so that S3 understands the request
    headers.host[0].value = origin_hostname;
    
    // return control to CloudFront with the modified request
    return callback(null,request);
};

当前CloudFormation配置

LambdaFunctionAssociations:
  - EventType: origin-request
    LambdaFunctionARN: !Ref HotSitesEdgeFunctionVersion 
CachePolicyId: "658327ea-f89d-4fab-a63d-7e88639e58f6"
ResponseHeadersPolicyId: "67f7725c-6f97-4210-82d7-5512b31e9d03" 

原因分析

  1. 默认缓存策略的缓存键未包含Host头
    你使用的658327ea-f89d-4fab-a63d-7e88639e58f6是CloudFront托管的Managed-CachingOptimized策略,该策略默认缓存键仅包含查询字符串,不包含Host头。由于你的Lambda逻辑依赖Host头区分不同站点,CloudFront会将不同Host的请求视为相同缓存键,导致缓存命中时跳过Lambda执行,或返回错误的站点路径。

  2. 缓存命中跳过origin-request事件
    Lambda@Edge的origin-request事件仅在缓存未命中时触发。如果缓存键不区分Host,不同站点的请求会命中同一缓存条目,Lambda代码根本不会执行,自然无法修改源路径。

解决方法

1. 创建自定义缓存策略,将Host头纳入缓存键

自定义缓存策略需明确将Host头加入缓存键,确保CloudFront为不同Host生成独立缓存条目:

CustomMultiSiteCachePolicy:
  Type: AWS::CloudFront::CachePolicy
  Properties:
    CachePolicyConfig:
      Name: MultiSite-Cache-Policy
      DefaultTTL: 86400
      MaxTTL: 31536000
      MinTTL: 0
      ParametersInCacheKeyAndForwardedToOrigin:
        CookiesConfig:
          CookieBehavior: none
        HeadersConfig:
          HeaderBehavior: whitelist
          Headers:
            - Host
        QueryStringsConfig:
          QueryStringBehavior: none

2. 更新缓存行为配置,引用自定义缓存策略

将原默认缓存策略替换为自定义策略,确保缓存键包含Host:

LambdaFunctionAssociations:
  - EventType: origin-request
    LambdaFunctionARN: !Ref HotSitesEdgeFunctionVersion 
CachePolicyId: !Ref CustomMultiSiteCachePolicy
ResponseHeadersPolicyId: "67f7725c-6f97-4210-82d7-5512b31e9d03"

3. 验证Lambda@Edge部署与执行

  • 确认Lambda@Edge已部署至us-east-1区域(CloudFront全局事件要求)
  • 检查CloudFront分发的Lambda关联事件类型为origin-request
  • 通过CloudFront日志验证Host头是否被正确纳入缓存键,Lambda代码是否正常执行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:30:49