AWS Lambda@Edge 502 CloudFront重定向时出现LambdaValidationError.&l



我有一个lambda函数,如果它有使用regex生成的uri,则执行301重定向。

const redirects = {
xyz: '/contact',
abc: '/about',
};
const arrRegex = [
{ regex: /xyz/faq/max, redirect: redirects.xyz },
{ regex: /abc/faq/min, redirect: redirects.abc },
{ regex: /lmn?page=[1-9]/, redirectNotNeeded }
];
function redirect(request) {

let requests = request.uri;
let finalUrl = '';
arrRegex.some(reg => {
const re = new RegExp(reg.regex);
if (requests.match(re) && reg.redirectNotNeeded) {
finalUrl = request;
return true;
} else if (requests.match(re) && reg.redirect) {
finalUrl = reg.redirect;
return true;
} else {
return requests.match(re) && !reg.redirect;
}
});
return finalUrl;
}
exports.handler = (event, context, callback) => {

// find request URL
const request = event.Records[0].cf.request;
request.uri = redirect(request);

let prefixPath; // needed for 2nd condition
if (request.uri.match('.+/$')) {
request.uri += 'index.html';
callback(null, request);
} else if (prefixPath = request.uri.match('(.+)/index.html')) {
const response = {
status: '301',
statusDescription: 'Found',
headers: {
location: [{
key: 'Location', value: prefixPath[1] + '/',
}],
}
};
callback(null, response);
} else if (request.uri.match('/[^/.]+$')) {
const response = {
status: '301',
statusDescription: 'Found',
headers: {
location: [{
key: 'Location', value: request.uri + '/',
}],
}
};
callback(null, response);
} else {
callback(null, request);
}
};

在部署该功能并将其添加到云前行为时,当我转到urlhttps:my-website/xyz/faq/max时,即使我在正确重新路由到https:my-website/contact后看到301https:my-website/xyz/faq/max的状态,它显示502错误。它也显示了https:my-website的相同错误。在状态下的chrome中,我在响应头下看到LambdaValidationError from cloudfront。我可以知道我在这里做错了什么来抛出这个错误吗?这些页面只是存储在使用Amazon CloudFront服务的AWS S3桶中的静态页面。

let finalUrl = '';更改为let finalUrl = request.uri;帮助我摆脱了错误,因为我将其设置为空字符串,lambda抛出502错误,因为它无法在请求中没有uri时重定向流量。

const redirects = {
xyz: '/contact',
abc: '/about',
};
const arrRegex = [
{ regex: /xyz/faq/max, redirect: redirects.xyz },
{ regex: /abc/faq/min, redirect: redirects.abc },
{ regex: /lmn?page=[1-9]/, redirectNotNeeded }
];
function redirect(request) {

let requests = request.uri;
let finalUrl = request.uri;
arrRegex.some(reg => {
const re = new RegExp(reg.regex);
if (requests.match(re) && reg.redirectNotNeeded) {
finalUrl = request;
return true;
} else if (requests.match(re) && reg.redirect) {
finalUrl = reg.redirect;
return true;
} else {
return requests.match(re) && !reg.redirect;
}
});
return finalUrl;
}
exports.handler = (event, context, callback) => {

// find request URL
const request = event.Records[0].cf.request;
request.uri = redirect(request);

let prefixPath; // needed for 2nd condition
if (request.uri.match('.+/$')) {
request.uri += 'index.html';
callback(null, request);
} else if (prefixPath = request.uri.match('(.+)/index.html')) {
const response = {
status: '301',
statusDescription: 'Found',
headers: {
location: [{
key: 'Location', value: prefixPath[1] + '/',
}],
}
};
callback(null, response);
} else if (request.uri.match('/[^/.]+$')) {
const response = {
status: '301',
statusDescription: 'Found',
headers: {
location: [{
key: 'Location', value: request.uri + '/',
}],
}
};
callback(null, response);
} else {
callback(null, request);
}
};

相关内容

  • 没有找到相关文章

最新更新