我正在尝试在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有关吗?似乎缺少一个基本功能!
答案 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,而不会强制重定向协议更改,但仅适用于与该路径模式匹配的请求。