配置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
相关产品推荐
相关产品推荐

