【问题标题】:S3 redirection rules to exclude one folderS3 重定向规则以排除一个文件夹
【发布时间】:2017-01-11 04:08:34
【问题描述】:

我正在尝试像我之前的许多其他人一样在 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-to-HTTPS 重定向,然后禁用 www.example.com S3 存储桶的重定向,以便.well-known 质询可以从 LetsEncrypt CA 访问。这很烦人,因为这意味着访问 www 网站的用户在证书更新期间不会被重定向到裸域。

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

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

有人能告诉我我缺少什么吗,或者这实际上在 S3 中是不可能的吗?似乎太基本的功能不能缺少!

【问题讨论】:

    标签: redirect amazon-s3


    【解决方案1】:

    好吧,确实缺少该功能,但应该是可能的,因为对于不可公开访问的对象或根本不存在,网站端点将希望返回403 Forbidden 响应...但是您可以使用路由规则覆盖该行为,并重定向而不是返回该错误。

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

    使用此功能,任何不存在且不可读的对象都会导致重定向,而存在且可公开读取的对象将正常提供...这是您正在寻找的行为。确保您没有将存储桶设置为允许“所有人”拥有“列表”权限。


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

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

    【讨论】:

    • 非常好,我并没有真正完全理解 HttpErrorCodeReturnedEquals 条件,现在它是有道理的。有用。并不能真正解决 HTTP 问题,但我应该能够让 Letsencrypt 在证书过期之前通过 HTTPS 挑战我的网站,所以如果我未能及时更新证书,我只需支付暂时禁用 HTTPS 重定向的代价,这对我来说已经足够好了。非常感谢!
    • 对不起,@Thomas,我应该提到......你也可以解决这个问题。我已经更新了答案。
    • 很好!!谢谢!。
    猜你喜欢
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 2014-08-27
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多