(我的设置:CloudFront + S3 Origin)
大家好!
这就是我想要做的:
步骤1.根据查看器请求触发Lambda函数。获取具有用户首选语言的cookie(如果可用)(此cookie在用户选择网站语言时设置)。
步骤2。在原始响应上触发Lambda函数。如果响应是错误(例如404),则根据步骤1中的首选语言cookie,将错误页面返回给查看器。
我的问题是:如何使在步骤1中获得的信息在步骤2中可用?通常,如何根据用户请求和原始响应信息处理响应?我将不胜感激任何建议。谢谢!
答案 0 :(得分:0)
您不需要执行步骤1。
将cookie列入白名单,以转发到缓存行为中的源。这将导致CloudFront根据cookie的值缓存每个页面的单独副本。如果您的原籍要能够看到Cookie,则仍然需要这样做。
在Lambda @ Edge中,有查看器端触发器(在缓存之前)和原始端触发器(在缓存之后)。
Origin Response触发器可以看到从原点返回的响应,但也可以看到发送到原点的请求。
请求
原始响应– CloudFront转发到原始请求的请求,该请求可能已被原始请求事件触发的Lambda函数修改
没有将信息从查看器请求触发器发送到原始响应触发器的快速方法,因为它们位于缓存的相对侧,并且无法直接通信。
您的处理程序将通过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分钟)将其存储在缓存中。