如何解决Lambda@Edge 在源请求上设置 Cookie
我正在为 2 个网站进行 A/B 测试,我在 s3 上有一个静态 React 站点,在 Hostgator 上有一个站点。
我想决定用户何时访问站点 A 和站点 B,并将决定的站点存储在 cookie 中。但问题是在请求转发时未设置 cookie。
这是以下代码,此 lambda 由 CloudFront 在 Origin Request 上触发:
function getHeader(name,headers){
let result = null;
Object.keys(headers).forEach((key) => {
if (key.toLowerCase() === name.toLowerCase() && headers[key].length)
result = headers[key];
});
return result;
}
function randomChoose() {
if (Math.random() >= .7) {
return 'new-site';
}
return 'old-site';
}
function addMinutes(date,minutes) {
return new Date(date.getTime() + minutes*60000);
}
exports.handler = (event,context,callback) => {
const cookies = getHeader('cookie',headers);
let choosenAB;
let setCookie;
let cookieA = 'controlversion=new-site';
let siteA = 'new-site-example.com';
let cookieB = 'controlversion=old-site';
let siteB = 'old-site-example.com';
if (cookies && Array.isArray(cookies)) {
cookies.forEach(val => {
if (val.value.indexOf(cookieA))
choosenAB = 'new-site';
else if (val.value.indexOf(cookieB))
choosenAB = 'old-site';
});
}
if (!choosenAB) {
const expireDate = addMinutes(new Date(),5);
choosenAB = randomChoose();
setCookie = `controlversion=${choosenAB}; expires=${expireDate.toGMTString()}; Secure; HttpOnly`;
}
let origin = request.origin.s3;
if (choosenAB === 'old-site')
{
request.origin = {
custom: {
domainName: siteB,port: 80,protocol: 'http',readTimeout: 20,keepaliveTimeout: 5,customHeaders: {},headers: {},sslProtocols: ['TLSv1','TLSv1.1'],}
}
if (request.uri && request.uri.indexOf('index.html'))
request.uri = request.uri.replace('index.html','');
origin = request.origin.custom;
request.headers['host'] = [{ key: 'host',value: siteB }];
}
if (setCookie) {
if (!origin.customHeaders)
origin.customHeaders = {};
origin.customHeaders['set-cookie'] = [];
origin.customHeaders['set-cookie'].push({ key: 'Set-Cookie',value: setCookie });
}
callback(null,request);
}
任何帮助将不胜感激。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。