AWS Lambda@edge.访问浏览器cookie在源响应触发功能



(我的设置:CloudFront + S3 Origin(

大家好!

这就是我要做的:

第 1 步。根据查看器请求触发 Lambda 函数。获取具有用户首选语言的 Cookie(如果用户选择网站语言时设置此 Cookie(。

第 2 步。在源响应上触发 Lambda 函数。如果响应是错误(例如 404(,请根据步骤 1 中的首选语言 Cookie 向查看器返回错误页面。

我的问题是:如何在步骤 1 中获取的信息在步骤 2 中可用?通常,如何根据用户请求和源响应信息处理响应?我将不胜感激任何建议。谢谢!

您不需要步骤 1。

在缓存行为中将要转发到源的 cookie 列入白名单。 这会导致 CloudFront 根据 Cookie 的值缓存每个页面的单独副本。 无论如何,如果您的来源能够看到cookie,您都需要这个。

在Lambda@Edge中,有查看器端触发器(在缓存前面(和源端触发器(在缓存后面(。

源响应触发器可以看到从源返回的响应,但也可以看到发送到源的请求。

请求

源响应 – CloudFront 转发到源的请求,可能已被由源请求事件触发的 Lambda 函数修改

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-event-structure.html#lambda-event-structure-response

没有一种将信息从查看器请求触发器发送到源响应触发器的方法,因为它们位于缓存的两侧,无法直接通信。

您的处理程序将传递一个event

您需要的一切都在event.Records[0].cf

const cf = event.Records[0].cf;

响应以cf.response格式,请求以cf.request为单位。

如果响应状态不是 404,请退出源响应触发器并允许 CloudFront 继续处理。

if(cf.response.status != "404')
{
return callback(null, cf.response);
}

否则,从cf.request.headers.cookie中提取 cookie(您需要在验证此数组存在后解析它 - 如果浏览器未提供 cookie,则不会(,根据 cookie 生成自定义响应,然后返回它。

请参阅生成的响应 - 示例,了解如何返回生成的响应。

由于您在源响应触发器中生成响应,因此它将根据错误缓存最小 TTL(默认为 5 分钟(的值存储在缓存中。

最新更新