由 S3 支持的 CloudFront 使用中间 HTTP 重定向,甚至来自 HTTPS

CloudFront backed by S3 uses intermediate HTTP redirects even from HTTPS

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

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

一切正常,除了一个奇怪的地方:无论我使用哪种重定向方法,当我从 foo.html 重定向到 bar.html 时,即使从 HTTPS URL 开始,CloudFront 也会最初 return 一个不安全的基于 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 表单?

Why is CloudFront providing the intermediate HTTP redirect?

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

As my initial URL is using HTTPS, why doesn't it directly redirect to the HTTPS form?

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

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

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

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

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

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