node.js - AWS Cloudfront + lambda@edge 修改 html 内容(使所有链接绝对 -> 相对)
问题描述
我(可能错误地)假设 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);
};
失败是因为您无法使用此语法引用原始响应正文。
我可以修改此脚本以使其按预期工作,还是应该考虑在 AWS 上使用其他服务?
我的背景 :
我们正在尝试建立一个 AWS Cloudfront 发行版,它可以整合对多个网站的访问,如下所示:
ttp://foo.com/ -> https:/newsite.com/foo/
ttp://bar.com/ -> https:/newsite.com/bar/
ttp://boo.com/ -> https:/newsite.com/boo/
这些网站目前由外部各方管理。我们希望禁用对 foo/bar/boo 的直接公共访问,并将 newsite.com 作为 Internet 上唯一可见的站点。
将原点映射到单个 cf 分布相对简单。但是,如果从 Web 中删除了当前域名,则这样做会破坏指定具有绝对 url 文件的文件的 html 内容。
ttp://foo.com/images/1.jpg
-> (disable foo.com dns)
-> image not found
为了受益于云端缓存和其他优点,我想将 html 文件中的所有绝对文件引用修改/重写为相对 url -
所以
<img src="ttp://foo.com/images/1.jpg">
变成
<img src="/foo/images/1.jpg">
//(accessed as https:/newsite.com/foo/images/1.jpg from a user)
//(maybe I should make it an absolte url for SEO purpose)
(由于限制使用被禁域名foo.com,http改为ttp)
(编辑)我发现了这个 AWS 博客,这可能是一个很好的提示,但对我的期望来说有点太复杂了。(设置一个 linux 容器,这样我就可以使用 sed 来处理 html 文件,也许使用 S3 作为临时存储)希望我能找到一个更简单的方法: https ://aws.amazon.com/blogs/networking-and-content -delivery/resize-images-with-amazon-cloudfront-lambdaedge-aws-cdn-blog/
解决方案
根据我刚刚了解到的情况,很遗憾,您无法在 Lambda@edge 中修改响应正文。您只能清除或完全替换正文内容。我希望能够清除来自旧站点的所有响应,但是使用 Cloudfront Lambda@Edge 将不允许这样做。
正如 AWS 文档在此处所述:
当您使用 HTTP 响应时,Lambda@Edge 不会将源服务器返回的正文公开给源响应触发器。您可以通过将其设置为所需的值来生成静态内容主体,或者通过将值设置为空来删除函数内部的主体。如果您不更新函数中的正文字段,则源服务器返回的原始正文将返回给查看器。
推荐阅读
- macos - 我可以关闭当前浏览器窗口并将焦点返回给在选项卡打开之前拥有它的应用程序吗?
- c# - 如何在 Windows 窗体的前端显示字母数字 ID 并在达到限制后停止接受更多条目?
- excel - Excel:不用单独做,是否可以求出每个对应行业的平均值?
- c# - 使用 .net5 的 huysentruitw 的 SapNwRfc 连接器中的 EnsureLibraryPresent 错误
- .net-core - 使用 net 5.0 运行 Nunit 控制台
- mysql - mysql 不使用索引。帮我弄清楚为什么
- html - 是否可以调整网格中一行的每个单独项目的高度?
- java - Springboot配置服务器启动失败
- ffmpeg - ffmpeg 无法使用不受支持的编解码器删除流
- python - Python:尝试从系列中创建字典会给出键错误 0