在 AWS Cloudfront 源请求中返回带有 set-cookie 标头的响应

Posted

技术标签:

【中文标题】在 AWS Cloudfront 源请求中返回带有 set-cookie 标头的响应【英文标题】:returning response with set-cookie header in AWS Cloudfront origin request 【发布时间】:2021-12-29 05:24:54 【问题描述】:

在我的 CloudFront 原始请求 lambda@edge 函数中,我想返回一个响应,该响应将在浏览器中设置一个 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' ,
    ]
  
;

不幸的是,CloudFront 似乎删除/忽略了这个 set-cookie 标头,并且浏览器收到了没有它的响应。有趣的是,完全相同的代码在放置在 CloudFront 查看器请求函数中时会起作用。有没有办法让 origin-request lambda 在响应中保留 set-cookie 标头?

【问题讨论】:

【参考方案1】:

解决方案是使用正确的白名单 cookie 名称启用 Cookies - include specified cookies 选项的缓存策略。问题中的行为是由以下原因引起的(如documentation 所述):

不要将 cookie 转发到您的源 – CloudFront 不会根据查看器发送的 cookie 缓存您的对象。 此外,CloudFront 会在将请求转发到您的源之前删除 cookie,并在将响应返回给您的查看器之前从响应中删除 Set-Cookie 标头。

要防止通过列入白名单的 cookie 名称进行缓存,请将以下标头添加到响应中:Cache-Control: no-cache="Set-Cookie"

【讨论】:

以上是关于在 AWS Cloudfront 源请求中返回带有 set-cookie 标头的响应的主要内容,如果未能解决你的问题,请参考以下文章

如何强制 Cloudfront 将来自源的所有请求强制为 HTTPS?

Cloudfront 自定义源分发返回 502“错误无法满足请求。”对于某些 URL

AWS CloudFront:不存在这样的存储桶

AWS CloudFront 签名 Cookie CORS 问题

只允许 CloudFront 从源服务器读取?

使用 AWS CloudFront 时,如何向公众隐藏自定义源服务器?