0

我将 AWS S3 存储桶设置为网站。它对 DNS 使用 Route 53,对 SSL 证书使用 AWS Certificate Manager。公共站点是使用 HTTPS 的 S3 网站存储桶的 CloudFront 分配。分发设置为将 HTTP 重定向到 HTTPS。整个 AWS 配置是使用 AWS Java SDK v2 以编程方式设置的(尽管这与问题无关,因为我可以通过 AWS Web 控制台手动验证所有这些)。

我尝试了两种从foo.htmlto的重定向bar.html,都成功了:

  • 使用路由规则重定向<ReplaceKeyWith>bar.html</ReplaceKeyWith>,确保添加一个<HostName>(参见关于另一个 Stack Overflow 问题的更多讨论)。
  • 使用重定向 S3 对象重定向,重定向位置设置为/bar.html(因为对象重定向显然需要绝对路径)。

一切正常,除了一个奇怪之处:无论我使用哪种重定向方法,当我从foo.htmlto重定向时bar.html,即使从 HTTPS URL 开始,CloudFront 最初都会返回一个不安全的基于 HTTP 的间接 URL,然后重定向到 HTTPS URL,例如这:

  1. https://example.com/foo.html重定向到
  2. http://example.com/bar.html重定向到
  3. https://example.com/bar.html

路由规则重定向和 S3 对象重定向都会发生这种情况。我在 Windows 10 上使用 Chrome 和 Firefox 中的网络开发人员工具对此进行了测试。

为什么 CloudFront 提供中间 HTTP 重定向?由于我的初始 URL 使用的是 HTTPS,为什么它不直接重定向到 HTTPS 表单?

4

1 回答 1

0

为什么 CloudFront 提供中间 HTTP 重定向?

不,是 S3 处理重定向,而不是 CloudFront。

由于我的初始 URL 使用的是 HTTPS,为什么它不直接重定向到 HTTPS 表单?

在您尝试的两种重定向方法中,您都可以将协议设置为https,这将使您的网站https直接重定向到 URL。

例如,我已经测试过以下路由规则会按预期工作。

<RoutingRules>
  <RoutingRule>
    <Redirect>
      <HostName>www.example.com</HostName>
      <Protocol>https</Protocol>
      <ReplaceKeyWith>abc</ReplaceKeyWith>
    </Redirect>
  </RoutingRule>
</RoutingRules>

上面的路由规则生成以下 301 响应头:

Location: https://www.example.com/abc

如果您使用对象进行重定向,您可以将前缀添加https到键对应的值字段中Website-Redirect-Location

于 2020-05-10T00:32:08.997 回答