AWS Cloudfront + lambda@edge修改html内容(使所有链接绝对 - >相对)

tai*_*ayo 9 node.js amazon-cloudfront aws-lambda

我(也许是错误的)假设 lambda@edge 可以修改 origin.responce 内容,所以写了一个像这样的 lambda 函数:

/* this does not work. response.Body is not defined */

'use strict';
exports.handler = (event, context, callback) => {
  var response = event.Records[0].cf.response;
  var data = response.Body.replace(/OLDTEXT/g, 'NEWTEXT');
  response.Body = data;
  callback(null, response);
};
Run Code Online (Sandbox Code Playgroud)

这会失败,因为您无法使用此语法引用原始响应主体。

我可以修改此脚本以使其按我的预期工作吗?或者我应该考虑使用 AWS 上的其他服务吗?

我的背景 :

我们正在尝试建立一个 AWS Cloudfront 发行版,以整合对多个网站的访问,如下所示:

ttp://foo.com/ -> https:/newsite.com/foo/
ttp://bar.com/ -> https:/newsite.com/bar/
ttp://boo.com/ -> https:/newsite.com/boo/
Run Code Online (Sandbox Code Playgroud)

这些网站目前由外部机构管理。我们希望禁用对 foo/bar/boo 的直接公共访问,并仅将 newsite.com 作为互联网上唯一可见的站点。

将起源映射到单个 cf 分布相对简单。但是,如果从网络中删除当前域名,这样做会破坏指定具有绝对 url 的文件的 html 内容。

ttp://foo.com/images/1.jpg
 -> (disable foo.com dns)
  -> image not found
Run Code Online (Sandbox Code Playgroud)

为了受益于cloudfront缓存和其他优点,我想将html文件中的所有绝对文件引用修改/重写为相对url -
所以

ttp://foo.com/ -> https:/newsite.com/foo/
ttp://bar.com/ -> https:/newsite.com/bar/
ttp://boo.com/ -> https:/newsite.com/boo/
Run Code Online (Sandbox Code Playgroud)

变成

ttp://foo.com/images/1.jpg
 -> (disable foo.com dns)
  -> image not found
Run Code Online (Sandbox Code Playgroud)

(因限制使用禁域名foo.com,http改为ttp)

(编辑)我找到了这个 AWS 博客,这可能是一个很好的提示,但感觉有点过于复杂,超出了我的预期。(设置一个linux容器,这样我就可以使用sed来处理html文件,也许使用S3作为临时存储)希望我能找到一种更简单的方法: https ://aws.amazon.com/blogs/networking-and-content -交付/调整图像大小-with-amazon-cloudfront-lambdaedge-aws-cdn-blog/

小智 9

不幸的是,根据我刚刚了解到的情况,您无法修改 Lambda@edge 内的响应正文。您只能清除或完全替换正文内容。我希望能够清除旧站点的所有响应,但使用 Cloudfront Lambda@Edge 不允许这样做。

\n

正如 AWS 文档所述

\n

当您使用 HTTP 响应时,Lambda@Edge 不会将源服务器返回的正文公开给源响应触发器。您可以通过将其设置为所需的值来生成静态内容主体,或者通过将该值设置为空来删除函数内的主体。如果您不更新函数中的 body 字段,源服务器返回的原始正文将返回给查看器。

\n