AWS CloudFront origin-request返回Set-Cookie被忽略怎么解决?
问题根因
origin-request 阶段的 Lambda@Edge 直接返回响应时,CloudFront 会将这个响应视为源站返回的响应,走默认缓存处理流程:默认会删除响应中的Set-Cookie头,避免该头被缓存后透传给其他无关用户。而 viewer-request 阶段返回的响应会直接发送给浏览器,不会经过缓存处理流程,因此Set-Cookie可以正常透传。
解决方案
方案1(推荐,无需修改CloudFront配置)
在你返回的302响应中增加Cache-Control头,明确告知CloudFront该响应不需要缓存,CloudFront 就不会主动移除Set-Cookie头:
return { status: '302', statusDescription: 'Found', headers: { location: [ { key: 'Location', value: 'my.website.com' }, ], 'set-cookie': [ { key: 'Set-Cookie', value: 'key=value; Max-Age=600' }, ], 'cache-control': [ { key: 'Cache-Control', value: 'no-cache, no-store, must-revalidate' } ] } };
302跳转本身属于临时重定向,通常不需要缓存,该方案不会影响业务逻辑,同时能直接解决问题。
方案2(适用需要缓存该响应的场景)
如果你的业务逻辑需要缓存这个302响应,同时要保留Set-Cookie头,需要调整CloudFront分发的缓存策略:
- 进入对应CloudFront分发的「行为」设置页面,找到关联该Lambda@Edge的缓存行为,点击编辑
- 如果你使用的是默认托管缓存策略,需要新建自定义缓存策略
- 在自定义缓存策略的「响应头包含规则」中,添加
Set-Cookie到允许透传的响应头列表中 - 保存配置后等待CloudFront分发生效
注意:如果缓存带Set-Cookie的响应,所有命中该缓存的用户都会被设置相同的Cookie,需提前确认业务逻辑允许该情况
内容的提问来源于stack exchange,提问作者K. Drab
相关产品推荐
相关产品推荐

