首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cloudfront重写/重映射内容有两个URL吗?

Cloudfront重写/重映射内容有两个URL吗?
EN

Stack Overflow用户
提问于 2018-03-04 22:26:39
回答 2查看 7.1K关注 0票数 7

我正在管理一个在这个模式中包含URL的文档网站:

代码语言:javascript
复制
/product-foo/1.2.3/user-guide/system-requirements.html

我希望页面上有两个URL:

代码语言:javascript
复制
/product-foo/1.2.3/user-guide/system-requirements.html  
/product-foo/latest/user-guide/system-requirements.html

可以通过Apache服务器完成,如

http://httpd.apache.org/docs/2.4/rewrite/remapping.html

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

其想法是,对于每个新产品版本,我将更新重定向,以便将“最新”模式指向最近发布的版本的文档。这样,如果人们想要的话,就可以链接到最新的文档,或者如果愿意的话,可以链接到特定版本的版本。

这可以用Cloudfront配置来完成吗?是否可以单独使用s3而不使用Cloudfront?可以用AWS Lambda或Lambda@Edge来完成吗?(解决方案是否受Lambda@Edge带宽限制?)您能提供一个具体的示例解决方案吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-06 02:10:17

这可以使用Lambda@Edge触发器来完成。生成的Lambda@Edge响应大小限制不适用,除非Lambda函数本身实际上是通过将响应对象的body属性填充到它在其他地方创建或获得的内容来生成响应,从而在函数中生成响应。

使用原产地请求触发器:

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

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

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

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

代码语言:javascript
复制
'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);
};

event.Records总是一个完全由一个成员组成的数组,而event.Records[0].cf包含这个特定调用的所有相关信息。event.Records[0].cf.request是最初的请求。修改此对象并将其作为回调的第二个参数提供,将指示CloudFront使用修改后的请求继续正常处理。

回调的第一个参数总是null,表示没有出现异常。如果抛出一个异常,或者第一个参数不是null,那么CloudFront将向查看器返回一个通用错误.它不显示异常,因为它可能包含不应公开的堆栈跟踪或其他敏感信息。在Lambda日志中可以访问该错误。

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

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

票数 11
EN

Stack Overflow用户

发布于 2018-03-04 22:45:50

你可以用很多方法做这件事。

您可以用新名称指向s3桶中的对象。

使用cloudfront中的模式,如果没有任何内容与您的模式匹配,则可以将其发送到带有API网关的lambda,在那里您可以使用重定向配置新文件的位置。您可以将错误路径作为路径参数接收到lambda。您可以在s3位置或发电机或任何所需存储上维护配置。

希望能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49101162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档