静态 S3 网站端点未通过 HTTPS 重定向

Posted

技术标签:

【中文标题】静态 S3 网站端点未通过 HTTPS 重定向【英文标题】:Static S3 Website endpoint not redirected over HTTPS 【发布时间】:2018-10-22 10:17:30 【问题描述】:

我正在尝试(并且大部分成功)在 S3 中建立一个静态网站,该网站通过网址 www.example.com 和 example.com 提供服务(这两个网站都可以使用通过 ACM 提供的证书在 https 上正常工作)。它的这两个域都指向一个云端分发设置,其中 S3 存储桶作为其在 Route 53 中的端点。

我还有多个 Elastic Beanstalk 实例,它们通过不同的子域提供服务。 app.example.com 指向除登录页面之外的一个服务页面,而 api.example.com 正在提供该 api。所有这些都运行良好,并且通过 Route 53 为子域设置。

唯一不起作用的是我有以下重定向设置:

<RoutingRules>    
<RoutingRule>
    <Condition>
      <KeyPrefixEquals>login/</KeyPrefixEquals>
    </Condition>
    <Redirect>
    <Protocol>https</Protocol>
      <HostName>app.example.com</HostName>
      <ReplaceKeyPrefixWith>login/</ReplaceKeyPrefixWith>
    </Redirect>
  </RoutingRule>
</RoutingRules>

所以我希望发生的是,当有人访问 (www.)example.com 时,它会转到 S3 中托管的登录页面,而当他们转到 (www.)example.com/login 时,它会转到 ( www.)app.example.com/login(指向 ELB)。这在我使用 HTTPS 访问 https://(www.)example.com/login 时不起作用,但如果我只是通过 http 访问我的 s3 存储桶 url:http://example.com.s3-website.ca-central-1.amazonaws.com/login 成功重定向到 app.example.com/login。

不确定我遗漏了什么,但由于主机名与实际 s3 存储桶的主机名不同,S3 静态网站属性中的重定向规则是否无法通过 HTTPS 工作?这就是我能想到的,因为如果我从 s3 url 访问端点而不使用 SSL 证书通过我的域名,它工作正常。

【问题讨论】:

“不起作用”......它以什么具体方式不起作用?任何实际到达存储桶的请求都会触发重定向规则。我没有看到你在哪里描述了当你尝试使用 https 访问它时会发生什么。 嘿@Michael-sqlbot 我最近从技术社区的某个人那里了解到,与我完全相同的事情是托管在 S3 上的静态网站不支持通过 HTTPS 的重定向规则,他们显然不要通过 SSL 触发(这显然来自亚马逊支持),所以除非它已经改变,否则这对他们来说是一种非常奇怪的方式。 规则不会通过 HTTPS 触发 实际上并非如此。没有 CloudFront 的帮助,托管 S3 端点的静态网站根本不支持 HTTPS。您应该看到连接超时。 @Michael-sqlbot 很公平,我最终看到的是一个 xml 格式的页面,在尝试访问 example.com/login 时显示访问被拒绝,它应该根据规则重定向到我的其他服务器时不是通过 SSL。不是连接超时。 XML 表示您指向存储桶的 REST 端点,支持 HTTPS 但不支持重定向规则。 (HTTP REST 端点也不做重定向)。请参阅Key Differences Between the Amazon Website and the REST API Endpoint 以获取对此的解释。 【参考方案1】:

不是我最初问题的确切答案,但有一种不同的方法可以通过设置 Cloudfront 分发(如在原始问题中)来做我想做的事情,但添加第二个来源 - app.example.com服务器 - 然后在分发和 URL 中设置行为列表,将某些 url 路径路由到 S3 源或 App Server 源。

/css/* - s3
/js/* - s3
/login* - app server
/dashboard* - app server

等等。我有 * 路径设置指向应用服务器,因为我的登录页面是静态的并且只有 5 条路由。

【讨论】:

以上是关于静态 S3 网站端点未通过 HTTPS 重定向的主要内容,如果未能解决你的问题,请参考以下文章

使用 CloudFront 和目录重定向的 AWS S3 静态网站托管

使用 S3、CloudFront 和源路径的静态网站托管的子文件夹重定向问题

静态网站托管中子域的 AWS S3 存储桶重定向与 DNS CNAME

如何在 AWS S3 网站 CloudFront 中设置别名重定向?

如何在 aws s3 存储桶和云端执行从非 www 到 www 的 301 重定向

AWS CloudFront 重定向到 S3 存储桶