【问题标题】:CloudFront backed by S3 uses intermediate HTTP redirects even from HTTPS由 S3 支持的 CloudFront 使用中间 HTTP 重定向,甚至来自 HTTPS
【发布时间】:2020-05-09 23:57:37
【问题描述】:

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

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

  • 使用带有<ReplaceKeyWith>bar.html</ReplaceKeyWith> 的路由规则进行重定向,确保添加<HostName>(参见another Stack Overflow question 的更多讨论)。
  • 使用redirect S3 objects 重定向,重定向位置设置为/bar.html(因为对象重定向显然需要绝对路径)。

除了一个奇怪的地方,一切都很好:无论我使用哪种重定向方法,当我从 foo.html 重定向到 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 表单?

【问题讨论】:

    标签: amazon-web-services redirect amazon-s3 https amazon-cloudfront


    【解决方案1】:

    为什么 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
    

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

    【讨论】:

    • “不,是 S3 处理重定向,而不是 CloudFront。”我明白您在说什么,但这并不完全正确,因为 CloudFront 根据 S3 存储桶不知道的最终域 example.com 提供重定向。所以 CloudFront 必须进行一些转换。也许 S3 存储桶根据存储桶网站 URL 提供了 HTTP 重定向(因为 S3 网站无论如何只能是 HTTP),CloudFront 将其转换为前端域,但保留 HTTP。
    • "如果使用对象做重定向,可以在Website-Redirect-Location key对应的value字段中添加前缀https。"我猜你是说我必须构建完整的 CloudFront 面向用户的 URL,对吗?我不认为只是在重定向路径中添加 https: 前缀会起作用,对吗?
    • @GarretWilson 是的,我的意思是完整的网址。
    • @GarretWilson 不,CloudFront 不对从源发送的响应进行任何协议转换。
    • 我什么都懂,这很有帮助。 “CloudFront 不对从源发送的响应进行任何协议转换。”无需赘述,CloudFront 没有更改协议可能是真的(这是我的问题的根源),但我认为有趣的是,使用对象重定向 CloudFront 必须认识到 S3 存储桶重定向指向相同的 S3存储桶域,然后更改 URL domain 以匹配所服务的 CloudFront 域。但是,是的,看来我只需要提供带有正确 https: 方案的完整 URL。
    猜你喜欢
    • 2020-02-01
    • 2019-02-11
    • 2017-06-02
    • 2016-06-07
    • 2017-10-27
    • 1970-01-01
    • 2023-03-17
    • 2015-02-27
    • 2014-05-09
    相关资源
    最近更新 更多