问题是:为什么在lambda边缘的ViewerResponseEvents中返回响应之前,无法更改http状态?
我有一个Lambda函数,该函数必须检查每个响应并根据lambda函数中包含的JSON文件更改其状态代码。我在 Viewer响应中部署了该lambda函数,因为我希望该函数在每个响应之前在返回前执行。 Aws文档(https://aws.amazon.com/blogs/networking-and-content-delivery/lambdaedge-design-best-practices/)指出,如果要对所有请求执行功能,则应将其放置在查看器事件中。
因此,我创建了一个简单的函数,该函数基本上是在返回响应之前克隆和更改响应的http状态代码。我做了以下代码进行测试:
exports.handler = async (event) => {
const request = event.Records[0].cf.request;
console.log(request);
console.log(`Original response`);
const response = event.Records[0].cf.response;
console.log(`Original response`);
console.log(response);
//clone response just for change the status code
let cloneResponseReturn = JSON.parse(JSON.stringify(response));
cloneResponseReturn.status = 404;
cloneResponseReturn.statusDescription = 'Not Found';
console.log('Log Clone Response Return');
console.log(cloneResponseReturn);
return cloneResponseReturn;
};
当我访问cloudwatch中的日志时,它表明响应具有http 404代码,但是由于某些原因,cloudfront仍返回带有200状态代码的响应。 (我已经清除了浏览器缓存,并在邮递员等其他工具中对其进行了测试,但所有这些工具中,CloudFront均返回HTTP 200)
CloudWatch日志和响应打印:
如果我将此功能更改为在原始响应中执行,它将起作用,但我不想仅在缓存未命中时执行它(+如aws告诉我们仅在那种情况下才执行原始事件)。由于原始事件仅在高速缓存未命中执行,因此要执行重定向,我将必须创建一个chache头文件,以确保将始终执行原始事件。
真的很奇怪Edge Lambda的这种行为。有人知道我该如何解决吗?我已经尝试清理用于测试请求的浏览器和工具的缓存,也清理我的发行版的缓存,但仍然无法正常工作。
我一周前已在AWS论坛上发布了问题,但仍未得到答案:https://forums.aws.amazon.com/message.jspa?messageID=885516#885516
谢谢。