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

时间:2018-07-05 09:01:27

标签: amazon-web-services cookies amazon-s3 header aws-lambda

(我的设置:CloudFront + S3 Origin)

大家好!

这就是我想要做的:

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

步骤2。在原始响应上触发Lambda函数。如果响应是错误(例如404),则根据步骤1中的首选语言cookie,将错误页面返回给查看器。

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

1 个答案:

答案 0 :(得分:0)

您不需要执行步骤1。

将cookie列入白名单,以转发到缓存行为中的源。这将导致CloudFront根据cookie的值缓存每个页面的单独副本。如果您的原籍要能够看到Cookie,则仍然需要这样做。

在Lambda @ Edge中,有查看器端触发器(在缓存之前)和原始端触发器(在缓存之后)。

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

  

请求

     

原始响应– 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,然后将其返回。

有关如何返回生成的响应的信息,请参见Generated Responses - Examples

由于您是在原始响应触发器中生成响应,因此将根据Error Caching Minimum TTL的值(默认5分钟)将其存储在缓存中。