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

配置Origin Request类型Lambda@Edge后CloudFront S3源站无内容返回问题

问题根因
  • 你当前使用的Origin Request类型Lambda@Edge逻辑错误:Origin Request阶段的触发器如果返回response对象,CloudFront会直接终止请求流程,不会再转发请求到S3源站,你返回的响应仅包含200状态码和Set-Cookie头,没有任何响应体内容,所以页面加载为空白。
  • 你的需求是给最终返回给用户的响应添加Cookie,同时保留S3源站的index.html内容,Origin Request阶段无法实现该需求,该阶段仅用于修改发往源站的请求,或者直接返回自定义响应(跳过源站请求)。
修复方案

将Lambda@Edge的触发器类型改为Origin Response,该阶段会在CloudFront从源站拿到响应后、写入缓存前执行,你可以直接修改响应头添加Set-Cookie,不会修改源站返回的响应体内容,参考代码如下:

'use strict';

exports.handler = (event, context, callback) => {
  // 拿到CloudFront从源站获取的原始响应
  const response = event.Records[0].cf.response;
  const request = event.Records[0].cf.request;
  const headers = request.headers;
  
  // 读取国家码
  const countryCode = headers['cloudfront-viewer-country'] ? headers['cloudfront-viewer-country'][0].value : 'CA'; 
  
  // 给原始响应添加Set-Cookie头,建议补充Path和过期时间避免使用异常
  const newCookie = {
      key: 'Set-Cookie',
      value: `locale=${countryCode}; Path=/; Max-Age=86400`
  };
  if (response.headers['set-cookie']) {
      response.headers['set-cookie'].push(newCookie);
  } else {
      response.headers['set-cookie'] = [newCookie];
  }
  
  // 返回修改后的响应,包含原源站的所有内容和新加的Cookie
  callback(null, response);
};
额外注意事项
  • 部署Lambda@Edge必须选择us-east-1区域,执行角色需要包含edgelambda.amazonaws.com和lambda.amazonaws.com的信任关系。
  • 如果需要让不同国家的用户拿到对应Cookie,需要调整CloudFront的缓存策略,将Cloudfront-Viewer-Country头纳入缓存键,避免缓存的响应带错Cookie。
  • 若locale Cookie是用户个性化配置不需要缓存,可以在Set-Cookie里补充Cache-Control: private头,或者调整缓存策略忽略Set-Cookie头的缓存。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 10:24:02