【问题标题】:AWS CloudFront misinterprets routing rule and redirects resource back to S3 bucket object URLAWS CloudFront 误解了路由规则并将资源重定向回 S3 存储桶对象 URL
【发布时间】:2020-02-17 01:06:21
【问题描述】:

我有一个 AWS S3 存储桶;我们称之为example.com。我为静态网站托管配置了存储桶;例如,存储桶静态站点 URL 可能是 http://example.com.s3-website-us-west-1.amazonaws.com。我还有一个带有 AWS 托管证书的 CloudFront 分配,因此当我访问 https://example.com/ 时,它会从 S3 存储桶 http://example.com.s3-website-us-west-1.amazonaws.com/ 中提供内容。这一切都像做梦一样。

在我的网站上,我有一个文件 https://example.com/foo.html 已重命名为 https://example.com/bar.html。网络上的其他一些页面可能链接到 foo.html,因此在我的 S3 存储桶配置中,我为 foo.html 对象设置了重定向,如下所示:

<RoutingRules>
  <RoutingRule>
    <Condition>
      <KeyPrefixEquals>foo.html</KeyPrefixEquals>
    </Condition>
    <Redirect>
      <ReplaceKeyWith>bar.html</ReplaceKeyWith>
    </Redirect>
  </RoutingRule>
</RoutingRules>

当我尝试浏览到 http://example.com.s3-website-us-west-1.amazonaws.com/foo.html 时,它会发送一个 HTTP 301 永久重定向到 bar.html,所以我最终会到达 http://example.com.s3-website-us-west-1.amazonaws.com/bar.html,就像我预期的那样。

所以现在我将 S3 存储桶部署到 CloudFront 分配,如上所述。 CloudFront 状态显示“已部署”后,我浏览到 https://example.com/foo.html,预计会重定向到 https://example.com/bar.html。不好了;我被定向到http://example.com.s3-website-us-west-1.amazonaws.com/foo.html insetad!

为什么 CloudFront 分配会将我重定向回文字 S3 存储桶 URL?为什么对象不重定向到正确部署到 CloudFront 的同一存储桶中的相对对象?

请注意,我知道另一个问题 AWS Cloudfront redirecting to S3 bucket,但 这似乎不是这个问题的重复问题,因为另一个问题是指整个 CloudFront站点临时重定向到整个 S3 存储桶,而不是单个 S3 对象重定向失败以部署到 CloudFront。

【问题讨论】:

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


    【解决方案1】:

    首先,CloudFront 不遵循来自源的重定向,它接收到来自 S3 的响应,并按原样将其提供给客户端。 S3 正在发送此响应,因为在 S3 重定向规则中,您还需要指定 HOST 值。

    例如:

    <HostName>...</HostName>
    

    您可以将主机名定义为名称 example.com ot https://example.com,在响应中返回的 Location 标头中使用的主机名。

    https://docs.aws.amazon.com/AmazonS3/latest/dev/how-to-page-redirect.html

    注意:请记住在进行更改之前清除缓存并再次测试,cloudfront 也会缓存 3xx 响应。

    【讨论】:

    • 这似乎可行,谢谢!至少存储桶现在正在重定向到 CloudFront 分配。我将不得不等待 CloudFront 传播以查看它是否从 CloudFront 本身工作。我在文档中看到了HostName,但它说它是可选的,所以我想如果我把它排除在外,事情就会“正常工作”。说到“正常工作”,我知道 S3 存储桶静态网站将从 foo 重定向到 foo/ 以获取集合(目录)URL,这适用于存储桶和 CloudFront,而不会将两者混合。为什么路由规则不能以同样的方式工作?
    • James Dean,使用 &lt;HostName&gt; 似乎可以工作 但我刚刚注意到:如果我浏览到 https://example/com/foo.html,CloudFront 首先会重定向到 insecure http://example/com/bar.html,它然后使用 HTTPS 重定向到https://example/com/bar.html。您是否看到过相同的行为,您对如何使重定向直接转到 HTTPS 版本有任何想法吗?
    猜你喜欢
    • 2019-05-27
    • 2016-12-08
    • 2020-08-07
    • 1970-01-01
    • 2017-06-25
    • 2021-01-02
    • 1970-01-01
    • 2017-10-27
    • 2020-11-18
    相关资源
    最近更新 更多