gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:21:54 24 4
gpt4 key购买 nike

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

/product-foo/1.2.3/user-guide/system-requirements.html

我想要该页面有两个 URL:

/product-foo/1.2.3/user-guide/system-requirements.html  
/product-foo/latest/user-guide/system-requirements.html

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

"Assume we have recently renamed the page foo.html to bar.html and now want to provide the old URL for backward compatibility. However, we want that users of the old URL even not recognize that the pages was renamed - that is, we don't want the address to change in their browser.
Solution: We rewrite the old URL to the new one internally via the following rule:
RewriteEngine on
RewriteRule "^/foo\.html$" "/bar.html" [PT]"

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

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

最佳答案

这可以使用 Lambda@Edge 触发器来完成。 Lambda@Edge 生成的响应大小限制不适用,除非 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);
};

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

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

<小时/>

``当然,除非源服务器实际上通过重定向进行响应。

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

关于amazon-s3 - Cloudfront URL 重写/重新映射,因此内容有两个 URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49101162/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com