如何在具有 CloudFront 的 S3 托管网站的域上启用重定向?

如何在具有 CloudFront 的 S3 托管网站的域上启用重定向?

我正在尝试让重定向在 S3 托管的静态网站的域名内工作。也就是说,如果我指向 mydomain.com/foo,我希望它重定向到 mydomain.com;这应该基本上镜像 mydomain.com.s3-website-us-east-1.amazonaws.com/foo 被重定向到 mydomain.com.s3-website-us-east-1.amazonaws.com。现在发生的情况是 mydomain.com/foo 被重定向到 mydomain.com.s3-website-us-east-1.amazonaws.com/。

我有一个名为亚马逊文档以确保资源得到适当重定向。我还将 CloudFront 配置为指向 S3 网站端点 (mydomain.com.s3-website-us-east-1.amazonaws.com),以及在“备用域名 (CNAME)”中设置的域。

在 Route53 中,我创建了一个 A 记录以指向 CloudFront 的 d123456789.cloudfront.net 域名。因此,现在转到 mydomain.com 工作正常;但是,尝试转到会导致重定向的资源会让我回到丑陋的 S3 名称。

我怎样才能让 CloudFront 保持混合状态,但又获得友好的重定向行为,从而使我的域名始终处于领先地位?

编辑:为了举例,我试图将 /upload 重定向到 /;下面是我设置的方法: S3 重定向屏幕截图

编辑 2:澄清一下,将 foo.com/update 重定向到 foo.com/index.html 是最小的情况;理想情况下,我希望能够重定向任何foo.com/ 下的资源到 foo.com/index.html,这就是我追求重定向规则解决方案的原因。

答案1

您需要在路由规则中指定目标主机名和协议。这将强制Location:具有正确的(所需)主机名。

重定向几乎所有内容的最简单方法是创建一个匹配的路由规则403 Forbidden(因为 S3 默认拒绝所有内容)并指向您希望内容去往的位置。

<RoutingRules>
 <RoutingRule>
  <Condition>
    <HttpErrorCodeReturnedEquals>403</HttpErrorCodeReturnedEquals>
  </Condition>
  <Redirect>
   <Protocol>https</Protocol> 
   <HostName>target.example.com</HostName>
   <ReplaceKeyWith></ReplaceKeyWith>
  </Redirect>
 </RoutingRule>
</RoutingRules>

所有请求都应重定向到,除非请求的 URL 与ACL 或索引文档的https://target.example.com/现有对象匹配。public-read

如果结果不符合预期,您也可以将其更改为匹配 404,但不要这样做。如果 404 有效,则意味着您的存储桶策略过于宽松,允许未经身份验证的用户列出您的存储桶内容……因此,不要更改它 - 修复您的策略。在这里使用 403。

答案2

您无需为此使用高级重定向路由规则。只需上传一个带有重定向名称的零字节对象,并在元数据下设置重定向。这已记录在案这里

一个问题是你必须使用下面的 URL 格式或实际的域来访问它,如此支持案例(需要 AWS 登录)。

http://BUCKET_NAME.s3-website-ap-southeast-2.amazonaws.com/index.html

无论是否使用 Route53 作为 DNS,这都可以在直接访问 S3 时正常工作。

更新:我已经使用 S3 和 CloudFront 做了一个示例,我会保留几天,但我会提供屏幕截图来展示我所做的,以便它可以作为永久示例。您可以尝试重定向这里- redir.html 文件应该重定向回 index.html。

通过 CloudFront 访问时,此功能正常运行,但您必须手动在 CF 中输入您的来源,而不是使用下拉列表。信息在这里。这是因为只有网站端点支持重定向 -信息在这里

这是我在 S3 上设置重定向的方式 在此处输入图片描述

以下是重定向到外部网站的示例(关联在此处输入图片描述

以下是我为 cloudfront 设置 CloudFlare 和 cname 的方法 在此处输入图片描述

相关内容