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

Lambda@Edge的viewer response函数如何访问cloudfront-viewer-country请求头

viewer response函数可以访问请求信息

viewer response类型的Lambda@Edge的Event结构中,Records[0].cf下默认同时携带request和response两个对象,不存在不能访问请求信息的限制。你遇到的request未定义报错,优先排查两个方向:

  • 部署的代码是否存在拼写错误,比如变量名写错
  • 测试时使用的模拟事件是否符合Lambda@Edge的标准Event结构,有没有缺少cf.request字段

配置cloudfront-viewer-country头部可用的步骤

origin request策略仅控制CloudFront回源时发送给源站的请求头,要让viewer侧的Lambda函数拿到该头部,需要调整缓存行为关联的缓存策略:

  1. 进入对应CloudFront分发的「行为」配置页,选中绑定了Lambda@Edge函数的缓存行为点击编辑
  2. 找到「缓存键和源请求」板块,选择自定义缓存策略(如果之前用的是内置策略可以新建一个)
  3. 在自定义缓存策略的「头部」配置项中,选择「包括以下头部」,在下拉列表中选中CloudFront-Viewer-Country后保存策略
  4. 将修改后的缓存策略关联到对应缓存行为,保存CloudFront分发配置等待部署生效即可

代码优化建议

建议增加头部不存在的兼容逻辑,避免边界场景报错,参考代码:

exports.handler = async (event) => {
  const request = event.Records[0].cf.request;
  const response = event.Records[0].cf.response;
  // 兼容头部不存在的场景,默认 fallback 为英国
  const countryCodeHeader = request.headers['cloudfront-viewer-country'] || [{ value: 'gb' }];
  const locale = countryCodeHeader[0].value.toLowerCase();
  // 建议补充 cookie 作用域、有效期等配置,避免默认配置不符合预期
  response.headers['set-cookie'] = [{ value: `locale=${locale}; Path=/; Max-Age=86400; SameSite=Lax` }];
  return response;
};

内容的提问来源于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 07:06:03