重定向到index子文件夹的S3子文件夹

g3b*_*blv 14 amazon-s3 amazon-web-services amazon-cloudfront amazon-route53

我有一个域名example.com.我有一个名为example.comsetup 的S3存储桶,其中包含一个有效的index.html文件.现在,我想创建两个子文件夹名为oldnew,每个都包含一个单页应用程序的独立版本.请求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默认提供给您的来源更改.

选择源源时,Cloudfront将显示S3存储桶列表. 编辑原点

您不需要从下拉列表中显示的存储桶中设置源,而是需要从其S3设置页面获取该资源的静态Web主机端点并手动弹出. 静态主机端点url所在的位置

使用Cloudfront分发源的静态源意味着对该分发的任何请求都将使用S3的根对象查找,并且您的404响应应在引用流过时消失.

重要说明: 执行此操作后,请清除浏览器缓存并取消验证cloudfront分发中的项目.否则,您所做的更改将不会立即生效.

  • 为我工作!万分感谢!!!!因为这篇文章,你节省了我一天的时间。 (2认同)
  • 也为我工作过。 (2认同)
  • 有没有办法在没有尾随“/”的情况下为“https://stevepapa.com/my-great-new-post”实现相同的效果? (2认同)
  • 此方法的缺点是 S3 存储桶中的对象必须可公开访问,否则 CloudFront 将显示 403 禁止错误。 (2认同)

tlo*_*bon 8

如果您使用 CloudFront,则可以使用CloudFront 函数创建简单的重定向。

我修改了@jkingok的解决方案。

  1. 转到 CloudFront,然后单击“函数”。
  2. 单击创建函数,输入名称和可选描述
  3. 在开发部分中,输入下面的代码片段并从发布选项卡进行发布。
    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”,您可以将该函数的行为修改为适合您的方式。

  • 我目前使用它,它适用于所有路径,不确定这仅适用于根路径是什么意思。到目前为止唯一的挑战是,如果原始 URL 不以 / 结尾,相对路径就会失败。 (2认同)

jki*_*gok 5

所以昨晚我也遇到了这个问题。

问题如下:当S3配置为网站存储桶时,它是宽容的,并且将索引文档设置设置为,index.html并且将其应用到根目录,即example.com实际上被重定向到example.com/index.html,并且也将其应用到子文件夹级别,因此example.com/newexample.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发行版。

  • 这是一篇具有类似解决方案的 AWS 博客文章 https://aws.amazon.com/blogs/compute/implementing-default-directory-indexes-in-amazon-s3-backed-amazon-cloudfront-origins-using-lambdaedge/ (2认同)

Ali*_*iAx 5

使用 HTML 重定向文件有更简单的方法来完成此操作

  1. 创建一个名为 my-great-new-post 的纯文件(不用担心不会与同一个bucket中的文件夹发生名称冲突)

  2. 在该文件中编写元重定向代码(我粘贴了下面的代码)

  3. 将文件上传到根存储桶(my-great-new-post 文件夹所在的位置)

  4. 修改新文件的元数据并使 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)

  • 经过一年(阅读:多年)搞乱 S3 重定向规则后,我已经完成了。这效果最好。“最好”的意思是:多年来我每隔几个月就会这样做一次,我很欣赏它“确实有效”。 (2认同)

Mai*_*KaY 0

  1. 配置您的存储桶以交付静态网站
  2. 创建CloudFront 分配:将您的存储桶设置为Origin并保留为OriginPath空(默认值:/
  3. 创建链接到您的CloudFront 分配的Route53 RecordSet

您可以在这里找到有用的演练

example.com问题:如果您的客户输入(没有old/ )会发生什么new

编辑:2.是可选的。您还可以将 Route53 RecordSet 链接到静态网站,但CloudFront 使您能够为您的网站提供服务(在AWS Certificate Managerhttps的帮助下)。