S3重定向规则排除一个文件夹

时间:2016-09-03 02:07:49

标签: redirect amazon-s3

我正在尝试在S3和Cloudfront上托管静态网站,就像我之前的其他许多人一样。我已经完成了所有设置,并为我的裸域(称为example.com)和www.example.com创建了LetsEncrypt证书。

我有两个S3存储桶,称为www.example.com和example.com,以及两个相应的Cloudfront发行版,它们只指向各自的S3存储桶,而Route 53则设置了两个ALIAS A记录。

example.com S3存储桶包含我的网站,www.example.com存储桶设置为重定向到https://example.com

这很好用。然而,令人讨厌的是,当我需要更新两个域的LetsEncrypt证书时,我需要关闭Cloudfront中的HTTP到HTTPS重定向,然后禁用www.example.com S3存储桶的重定向,以便可以从LetsEncrypt CA访问.well-known challenge。这很烦人,因为这意味着在证书续订期间,访问www网站的用户不会被重定向到裸域。

我在考虑在两个存储桶上定义一个始终重定向到https://example.com的S3重定向规则,但是不包括LE CA的.well-known文件夹。通过这种方式,我可以让Cloudfront同时提供HTTP和HTTPS,在S3中处理重定向,并且LetsEncrypt续订将完全透明。但这似乎不可能用S3路由语法来表达:https://docs.aws.amazon.com/AmazonS3/latest/dev/HowDoIWebsiteConfiguration.html

似乎没有办法表达“如果键前缀不等于”条件,或任何表达“如果条件不匹配,什么也不做”的方式,所以任何排除文件夹的尝试都会出现必然会导致重定向循环。

有人可以告诉我我缺少什么,或者这实际上不可能与S3有关吗?似乎缺少一个基本功能!

1 个答案:

答案 0 :(得分:1)

嗯,这个功能确实缺失了,但它应该是完全相同的,因为对于那些不能公开访问或根本不存在的对象,网站端点将需要返回403 Forbidden响应...但您可以使用路由规则覆盖该行为,并重定向而不是返回该错误。

<RoutingRules>
  <RoutingRule>
      <Condition>
          <HttpErrorCodeReturnedEquals>403</HttpErrorCodeReturnedEquals>
      </Condition>
      <Redirect>
          <Protocol>https</Protocol>
          <HostName>www.example.com</HostName>
      </Redirect>
  </RoutingRule>
</RoutingRules>

使用此功能,任何不存在和可读的对象都会导致重定向,而存在且可公开阅读的对象会正常提供...这是您正在寻找的行为。确保你没有将你的水桶设置为允许&#34;每个人&#34; &#34;列表&#34;特权。

您还可以通过在CloudFront分配中创建第二个缓存行为来绕过此特定路径的强制重定向。

将此新行为中的Path Pattern设置为/.well-known/acme-challenge*(或任何适当的模式),并将Viewer Protocol Policy设置为HTTP and HTTPS。然后,请求将转发到S3,而不会强制重定向协议更改,但仅适用于与该路径模式匹配的请求。