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函数拿到该头部,需要调整缓存行为关联的缓存策略:
- 进入对应CloudFront分发的「行为」配置页,选中绑定了Lambda@Edge函数的缓存行为点击编辑
- 找到「缓存键和源请求」板块,选择自定义缓存策略(如果之前用的是内置策略可以新建一个)
- 在自定义缓存策略的「头部」配置项中,选择「包括以下头部」,在下拉列表中选中
CloudFront-Viewer-Country后保存策略 - 将修改后的缓存策略关联到对应缓存行为,保存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
相关产品推荐
相关产品推荐

