1

问题是:为什么在 lambda edge 的 ViewerResponseEvents 中返回响应之前无法更改 http 状态?

我有一个 Lambda 函数,它必须检查每个响应并根据我在 lambda 函数中的 JSON 文件更改它的状态代码。我在查看器响应中部署了这个 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 日志和响应打印:

云观察日志 回复

如果我将此函数更改为在原始响应中执行,它将起作用,但我不想仅在缓存未命中时执行它(+ as aws 告诉我们原始事件将仅在这种情况下执行+)。由于原始事件仅在缓存未命中时执行,因此要执行该重定向,我必须创建一个 chache 标头破坏器以确保始终执行原始事件。

edge lambda 的这种行为真的很奇怪。有谁知道我该如何解决这个问题?我已经尝试清理用于测试请求的浏览器和工具的缓存,还清理了我的发行版的缓存,但仍然无法正常工作。

我一周前在 AWS 论坛上发布了这个问题,但仍然没有答案: https ://forums.aws.amazon.com/message.jspa?messageID=885516#885516

提前致谢。

4

0 回答 0