Cloudfront URL重写/重新映射,因此内容有两个URL?

rcr*_*ews 3 amazon-s3 amazon-cloudfront aws-lambda

我正在管理具有以下格式URL的文档网站:

/product-foo/1.2.3/user-guide/system-requirements.html
Run Code Online (Sandbox Code Playgroud)

我要在页面上有两个 URL:

/product-foo/1.2.3/user-guide/system-requirements.html  
/product-foo/latest/user-guide/system-requirements.html
Run Code Online (Sandbox Code Playgroud)

http://httpd.apache.org/docs/2.4/rewrite/remapping.html所述,可以使用Apache Web服务器来完成

“假设我们最近将页面重命名foo.htmlbar.html,现在想提供旧的URL以实现向后兼容。但是,我们希望旧URL的用户甚至不认识页面已被重命名-也就是说,我们不希望该地址在他们的浏览器改变。
解决方法:我们重写旧的URL通过以下规则内部的新的:
RewriteEngine on
RewriteRule "^/foo\.html$" "/bar.html" [PT]"

想法是,对于每个新产品版本,我将更新重定向,以将“最新”模式指向最新发布版本的文档。这样,人们可以根据需要链接到最新文档,也可以根据需要链接到特定于版本的版本。

可以使用Cloudfront 配置完成此操作吗?没有Cloudfront,仅凭s3就能完成吗?可以使用AWS Lambda或Lambda @ Edge吗?(解决方案是否会受到Lambda @ Edge带宽限制的限制?)您能否提供一个具体的示例解决方案?

Mic*_*bot 6

可以使用Lambda @ Edge触发器来完成。LAMBDA的所产生的响应的大小限制@边缘不适用,除非lambda函数,本身,实际上是生成通过填充的响应body与内容已创建或获得其他地方响应对象的属性,从而产生所述函数内的响应。

使用原始请求触发器:

  • 仅在检查了缓存之后,并且仅在没有缓存命中时才触发触发器(对于缓存命中,不联系源,因此不需要调用触发器)
  • 在将请求发送到源之前触发触发器
  • 您可以修改将在请求中发送到原点的路径
  • 响应被缓存在浏览器最初请求的路径下,而不是修改后的路径下
  • 浏览器未重定向,因此地址栏不会更改。¹

从根本上讲,我们在Lambda函数中需要做的就是提取请求对象,修改URI²,并告诉CloudFront继续处理修改后的请求。我们只是在重写飞行中的部分请求,然后将控制权返回给CloudFront。

下面的示例几乎肯定不是处理一系列可能的字符串操作的最理想或整洁的方法,但是足以说明您想要通过任何映射和匹配机制来完成代码的一般思想。 。

您可以静态地重新映射值,也可以使用任何数量的数据库策略来查找原始路径并找到要使用的正确的当前目标。

'use strict';

exports.handler = (event, context, callback) => {
    const request = event.Records[0].cf.request;

    request.uri = request.uri
        .replace(/^\/product-foo\/latest\//,'/product-foo/1.0.0/')
        .replace(/^\/product-bar\/latest\//,'/product-bar/3.2.1/')
        .replace(/^\/product-three\/latest\//,'/product-three/5.5.5/');

    return callback(null, request);
};
Run Code Online (Sandbox Code Playgroud)

event.Records始终是一个只有一个成员的数组,并且event.Records[0].cf包含此特定调用的所有相关信息。 event.Records[0].cf.request是原始请求。修改此对象并将其作为回调的第二个参数提供给CloudFront使用修改后的请求继续进行正常处理。

回调的第一个参数始终为null,表示没有发生异常。如果引发了异常,或者第一个参数不是null,则CloudFront将通用错误返回给查看器...它不会显示异常,因为该异常可能包含堆栈跟踪或其他不应公开的敏感信息。该错误可在Lambda日志中访问。


¹当然,除非原始服务器实际以重定向响应。

²Lambda@ Edge所谓的“ URI”实际上只是路径。完整的URI从技术上讲是路径+'?' +查询字符串,但是Lambda @ Edge将这两件事分开。