g3b*_*blv 14 amazon-s3 amazon-web-services amazon-cloudfront amazon-route53
我有一个域名example.com.我有一个名为example.comsetup 的S3存储桶,其中包含一个有效的index.html文件.现在,我想创建两个子文件夹名为old和new,每个都包含一个单页应用程序的独立版本.请求https://example.com/old(我想省略在index.html浏览器的地址栏中输入请求时)将打开子文件夹index.html中的old文件并请求https://example.com/new打开index.html.执行这些重定向的最佳方法是什么?我应该在Route 53中设置一些东西example.com/old- > example.com/old/index.html还是有更好的方法吗?
Mar*_*lin 26
不需要lambda函数为项目增加费用和复杂性.
以下答案引自https://stevepapa.com/
https://stevepapa.com/my-great-new-post/预计将以相同的方式工作:https://stevepapa.com/my-great-new-post/index.html有一种聪明的方法可以让这些流入Cloudfront发行版,并且它涉及将源内容从Cloudfront默认提供给您的来源更改.
您不需要从下拉列表中显示的存储桶中设置源,而是需要从其S3设置页面获取该资源的静态Web主机端点并手动弹出.
使用Cloudfront分发源的静态源意味着对该分发的任何请求都将使用S3的根对象查找,并且您的404响应应在引用流过时消失.
重要说明: 执行此操作后,请清除浏览器缓存并取消验证cloudfront分发中的项目.否则,您所做的更改将不会立即生效.
如果您使用 CloudFront,则可以使用CloudFront 函数创建简单的重定向。
我修改了@jkingok的解决方案。
function handler(event) {
var request = event.request;
if (request.uri !== "/" && (request.uri.endsWith("/") || request.uri.lastIndexOf(".") < request.uri.lastIndexOf("/"))) {
if (request.uri.endsWith("/")) {
request.uri = request.uri.concat("index.html");
} else {
request.uri = request.uri.concat("/index.html");
}
}
return request;
}
Run Code Online (Sandbox Code Playgroud)
函数完成后,您可以通过转到分配的“行为”选项卡来使用该函数,选择要修改的路径模式,然后在“函数关联”下,对于查看器请求,选择“CloudFront 函数”作为函数类型,然后在下拉列表中选择您创建的函数。
保存行为后,您可以测试您的网站。
注意:此解决方案将每个不带扩展名的 URL 重定向到“URL/index.html”,您可以将该函数的行为修改为适合您的方式。
所以昨晚我也遇到了这个问题。
问题如下:当S3配置为网站存储桶时,它是宽容的,并且将索引文档设置设置为,index.html并且将其应用到根目录,即example.com实际上被重定向到example.com/index.html,并且也将其应用到子文件夹级别,因此example.com/new或example.com/new/两者都应重定向到example.com/new/index.html,在存储桶中将有一个对象。(如果没有,则会出现NoSuchKey错误。)
但是,然后您可能会将自己“升级”到CloudFront(可能是HTTPS),并且此功能消失了。CloudFront而是对S3进行显式API调用,因此不会触发索引文档让步。它确实适用于根目录,但不适用于子文件夹。
该RoutingRules解决方案在我看来并不干净,因为通过指定KeyPrefixEquals而不是键来完全等于(不存在),我认为您会得到意想不到的匹配。
相反,我实施了Lambda @ Edge规则,该规则将CloudFront向S3发出的请求重写为其中具有适当的键值。
从此处的Lambda文档和A / B测试示例开始:https : //docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-examples.html#lambda-examples-general-examples
将代码更改为:
'use strict';
exports.handler = (event, context, callback) => {
/*
* Expand S3 request to have index.html if it ends in /
*/
const request = event.Records[0].cf.request;
if ((request.uri !== "/") /* Not the root object, which redirects properly */
&& (request.uri.endsWith("/") /* Folder with slash */
|| (request.uri.lastIndexOf(".") < request.uri.lastIndexOf("/")) /* Most likely a folder, it has no extension (heuristic) */
)) {
if (request.uri.endsWith("/"))
request.uri = request.uri.concat("index.html");
else
request.uri = request.uri.concat("/index.html");
}
callback(null, request);
};
Run Code Online (Sandbox Code Playgroud)
并将其发布到您的CloudFront发行版。
使用 HTML 重定向文件有更简单的方法来完成此操作
创建一个名为 my-great-new-post 的纯文件(不用担心不会与同一个bucket中的文件夹发生名称冲突)
在该文件中编写元重定向代码(我粘贴了下面的代码)
将文件上传到根存储桶(my-great-new-post 文件夹所在的位置)
修改新文件的元数据并使 Content-Type:text/html
下面是文件的内容:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="refresh" content="0; url=/my-great-new-post/index.html">
</head>
<body>
</body>
</html>Run Code Online (Sandbox Code Playgroud)
Origin并保留为OriginPath空(默认值:/)您可以在这里找到有用的演练
example.com问题:如果您的客户输入(没有old/ )会发生什么new?
编辑:2.是可选的。您还可以将 Route53 RecordSet 链接到静态网站,但CloudFront 使您能够为您的网站提供服务(在AWS Certificate Managerhttps的帮助下)。
| 归档时间: |
|
| 查看次数: |
5378 次 |
| 最近记录: |