- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在管理一个具有以下模式 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
tobar.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/
这个问题在这里已经有了答案: Why don't Java's +=, -=, *=, /= compound assignment operators require casting? (11 个
我搜索了很多,但没有一个链接能帮助我解决这个问题。我得到了 ORA-21500: internal error code, arguments: [%s], [%s], [%s], [%s], [%s
我正在做 RegexOne 正则表达式教程,它有一个 question关于编写正则表达式以删除不必要的空格。 教程中提供的解决方案是 We can just skip all the starting
([\s\S]+|\s?) 中 |\s? 的目的或作用是什么?如果没有它,表达式会不会与 ([\s\S]+) 相同? 最佳答案 这不是完全相同的。 ([\s\S]+|\s?) 会匹配空字符串,而 ([
这个正则表达式有一组还是两组? 我正在尝试使用第二组访问 bookTitle 但出现错误: Pattern pattern = Pattern.compile("^\\s*(.*?)\\s+-\\s+
在 C 中给定一个字符串指针 s,下面的迭代会做什么?即它以什么方式遍历字符串? for (++s ; *s; ++s); 最佳答案 for (++s ; *s;++s) 表示 将指针 s 递增到字符
我正在用一个 node.js 应用程序解析一个大列表并有这段代码 sizeCode = dbfr.CN_DESC.split('\s+-\s*|\s*-\s+') 这似乎不起作用,因为它返回了 [ '
我正在编写一个简单的字符串连接程序。 该程序按照我发布的方式运行。但是,我首先使用以下代码编写它来查找字符串的结尾: while (*s++) ; 但是,这个方法并没有奏效。我传递给它的字符串
这个问题已经有答案了: What does (?和aramchand来自Mohandas Karamchand G 因此,在使用这些匹配来分割字符串后,您最终会得到 {"M", "K", "G"} 注
我正在尝试转换 Map到 List使用 lambda。 本质上,我想将键和值与 '=' 连接起来之间。这看起来微不足道,但我找不到如何去做。 例如 Map map = new HashMap<>();
我正在经历 K & R,并且在递增指针时遇到困难。练习 5.3(第 107 页)要求您使用指针编写一个 strcat 函数。 在伪代码中,该函数执行以下操作: 将 2 个字符串作为输入。 找到字符串
在下面的代码中,pS 和 s.pS 在最后一行是否保证相等?也就是说,在语句S s = S();中,是否可以确定不会构造一个临时的S? #include using namespace std; s
演示示例代码: public void ReverseString(char[] s) { for(int i = 0, j = s.Length-1; i < j; i++, j--){
我一直在寻找类似于 .NET examples 中的示例的 PowerShell 脚本.取一个 New-TimeSpan 并显示为 1 天 2 小时 3 分钟 4 秒。排除其零的地方,在需要的地方添加
def func(s): s = s + " is corrected" return s string_list = ["She", "He"] for s in string_li
我是 python 的新手。当我在互联网上搜索 lambda 时。我在 lambda_functions 中找到了这个声明. processFunc = collapse and (lambda s:
我最近开始学习正则表达式,并试图为上面的问题写一个正则表达式。如果限制只放在一个字母上(例如不超过 2 个“b”),这并不困难。 那么答案就是:a* c*(b|ε)a* c*(b|ε)a* c* 但是
当我运行 npm install 时出现以下错误,但我无法修复它。 我试过:npm install -g windows-build-tools 也没有修复这个错误 ERR! configure
有很多有趣的haskell网上可以找到片段。 This post可以在 this (awesome) Stack Overflow question 下找到. The author写道: discou
我知道以下三行代码旨在将字符串提取到$ value中并将其存储在$ header中。但是我不知道$value =~ s/^\s+//;和$value =~ s/\s+$//;之间有什么区别。 $val
我是一名优秀的程序员,十分优秀!