我正在使用AWS S3和cloudfront托管静态网站。当用户代理是whatsapp或其他时,我需要抓住......
所以,我正在使用与具有触发器的cloudfront关联的lambda@edge
函数。然后,Tigger有4个选项(viewer_request
,origin_request
,origin_response
,viewer_response
)。我正在开发一个小脚本,在viewer_request
上触发,如果用户代理是Whatsapp,则响应将是纯HTML,但如果用户代理是任何其他响应,则应该继续自然流,因此cloudfront应该响应index.html在cloudfront属性中配置。我无法继续使用index.html ...
我的代码:
let content = ``;
exports.handler = (event, context, callback) => {
var response = event.Records[0].cf.response;
const request = event.Records[0].cf.request;
const headers = JSON.stringify(request.headers);
if(headers.toUpperCase().indexOf("WHATSAPP")>0) {
console.log("is whatsapp");
var html = `
<html prefix="og: http://ogp.me/ns#">
<head>
<meta property="og:url"
content="http://www.nytimes.com/2015/02/19/arts/international/when-
great-minds-dont-think-alike.html" />
<meta property="og:type" content="article" />
<meta property="og:title" content="When Great Minds Don’t Think
Alike" />
<meta property="og:description" content="How much does culture
influence creative thinking?" />
<meta property="og:image"
content="http://static01.nyt.com/images/2015/02/19/arts/international/19iht-btnumbers19A/19iht-btnumbers19A-facebookJumbo-v2.jpg" />
</head>
<body>Whatsapp</body>
</html>
`;
response = {
status: '200',
statusDescription: 'OK',
headers: {
'cache-control': [{
key: 'Cache-Control',
value: 'max-age=100'
}],
'content-type': [{
key: 'Content-Type',
value: 'text/html'
}],
'content-encoding': [{
key: 'Content-Encoding',
value: 'UTF-8'
}],
},
body: html,
};
context.succeed(response);
} else {
context.succeed(null);
}
答案 0 :(得分:0)
允许CloudFront的请求处理从查看者请求或源请求触发器继续:
return callback(null,request);
答案 1 :(得分:0)
我遇到了同样的问题,我通过分成2个lambda函数来修复我的问题,一个处理request
,另一个处理response
。
viewer request
选择request
。并为一个流程origin response
选择response
。request
,请记得return callback(null, request)
为@ michael-sqlbot提及。注意:强>
viewer request
包含来自请求标头的原始用户代理,例如"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
origin request
包含CloudFront处理的标头,例如"Amazon CloudFront"
希望这有帮助,如果有任何不妥,请纠正我。
参考: