AWS CloudFront 错误解释路由规则并将资源重定向回 S3 存储桶对象 URL

AWS CloudFront misinterprets routing rule and redirects resource back to S3 bucket object URL

我有一个 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。网络上的其他一些页面可能 link 到 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 时,它会向 bar.html 发送一个 HTTP 301 永久重定向,所以我在 http://example.com.s3-website-us-west-1.amazonaws.com/bar.html 结束了,就像我期望的那样.

所以现在我将 S3 存储桶部署到 CloudFront 分配,如上所述。在 CloudFront 状态显示 "Deployed" 后,我浏览到 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 的同一存储桶中的相关对象?

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

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

例如:

<HostName>...</HostName>

您可以将主机名定义为名称 example.com 或 https://example.com,要在响应中返回的位置 header 中使用的主机名。

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

注意:修改之前记得清空缓存再测试,cloudfront 也会缓存 3xx 响应。