Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Redirect 排除一个文件夹的S3重定向规则_Redirect_Amazon S3 - Fatal编程技术网

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

Redirect 排除一个文件夹的S3重定向规则,redirect,amazon-s3,Redirect,Amazon S3,我正试图在S3和Cloudfront上建立一个静态网站,就像我之前的许多人一样。我基本上都已经设置好了,并且为我的裸域(称之为example.com)和www.example.com创建了LetsEncrypt证书 我有两个S3存储桶,分别称为www.example.com和example.com,以及两个相应的Cloudfront发行版,它们只指向各自的S3存储桶,路由53由两个别名A记录设置 example.com S3 bucket包含我的网站,而www.example.com bucke

我正试图在S3和Cloudfront上建立一个静态网站,就像我之前的许多人一样。我基本上都已经设置好了,并且为我的裸域(称之为example.com)和www.example.com创建了LetsEncrypt证书

我有两个S3存储桶,分别称为www.example.com和example.com,以及两个相应的Cloudfront发行版,它们只指向各自的S3存储桶,路由53由两个别名A记录设置

example.com S3 bucket包含我的网站,而www.example.com bucket设置为重定向到

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

我正在考虑在两个bucket上定义一个S3重定向规则,该规则将始终重定向到,但不包括LE CA的.well文件夹。这样,我可以让Cloudfront同时提供HTTP和HTTPS服务,在S3中处理重定向,并且LetsEncrypt续订将是完全透明的。但这似乎不可能用S3路由语法来表达:

似乎没有一种方法可以表示“如果键前缀不相等”条件,或者没有任何方法可以表示“如果条件不匹配,则不执行任何操作”,因此任何排除文件夹的尝试都可能导致重定向循环


有人能告诉我我遗漏了什么,或者这在S3中实际上是不可能的吗?似乎太基本的功能,不能错过

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

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

403
https
www.example.com
使用此方法,任何不存在且可读的对象都会导致重定向,而存在且可公开读取的对象通常会被服务。。。这就是你想要的行为。确保您的bucket没有设置为允许“所有人”拥有“列表”特权


通过在CloudFront发行版中创建第二个缓存行为,还可以绕过此特定路径的强制重定向


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

非常好,我没有真正完全理解HttpErrorCodeReturnedEquals条件,现在它有了意义。它起作用了。这并不能真正解决HTTP问题,但我应该能够让Letsencrypt在证书到期之前通过HTTPS挑战我的网站,因此如果我未能及时更新证书,我只需支付暂时禁用HTTPS重定向的代价,这对我来说已经足够了。非常感谢!“对不起,”托马斯,我应该提到。。。你也可以解决这个问题。我已经更新了答案。很好!!谢谢