我正在使用S3路由规则来弃用旧域,将流量路由到新域。因此,旧域名为product.com
,新位置为my-organization.com/product/
。
我正在使用路由规则来重定向页面。所以,我有这样的规则重定向FAQ:
<Condition>
<KeyPrefixEquals>faq</KeyPrefixEquals>
</Condition>
<Redirect>
<Protocol>https</Protocol>
<HostName>my-organization.com</HostName>
<ReplaceKeyPrefixWith>product/faq</ReplaceKeyPrefixWith>
<HttpRedirectCode>301</HttpRedirectCode>
</Redirect>
这很好用!
剩下要做的事情是将旧主页重定向到产品页面。我尝试使用/
来匹配主页:
<KeyPrefixEquals>/</KeyPrefixEquals>
但似乎没有任何匹配。我尝试在空键上进行匹配:
<KeyPrefixEquals></KeyPrefixEquals>
但这符合一切。有没有办法在S3路由规则中重定向主页?我想要的是:
<Condition>
<KeyPrefixEquals>/</KeyPrefixEquals>
</Condition>
<Redirect>
<Protocol>https</Protocol>
<HostName>my-organization.com</HostName>
<ReplaceKeyPrefixWith>product/</ReplaceKeyPrefixWith>
<HttpRedirectCode>301</HttpRedirectCode>
</Redirect>
谢谢!
答案 0 :(得分:0)
存储桶的根目录不是/
,而是空字符串。空键前缀不会完全符合您的要求,因为一切都有一个匹配空字符串的前缀(因为LEFT(${some_string},LENGTH('')) == ''
,无论${some_string}
的内容如何),所以这样的规则不会无论如何,只匹配 根。它会匹配一切。
没有办法专门重定向根页面,但这是我一直使用的解决方法,效果很好。将此作为您的最后一个路由规则(因为它们按顺序匹配,并且这个确实匹配尚未匹配的所有内容,如果还没有页面那么)。
<RoutingRule>
<Condition>
<HttpErrorCodeReturnedEquals>403</HttpErrorCodeReturnedEquals>
</Condition>
<Redirect>
<ReplaceKeyPrefixWith>product/</ReplaceKeyPrefixWith>
<Protocol>https</Protocol>
<HostName>new-site.example.com</HostName>
</Redirect>
</RoutingRule>
您不应该启用存储桶的公开列表,但如果这样做,则需要将403替换为403.如果您有索引文档,则需要将其删除。
基本上,对于因该路径缺少公共页面而被拒绝的任何请求,product/
会被追加,因此http://bucket.example.com/
变为https://new-site.example.com/product/
。
同样,http://bucket.example.com/some/random/file.txt
会重定向到https://new-site.example.com/product/some/random/file.txt
,但旧页面已无效,因此新页面无效,因此不会丢失任何内容。由于规则按顺序匹配,因此如果您最后添加规则,此规则不应该破坏其他任何内容。
或者,根据您实际需要做的宏观方案,一旦您从存储桶中删除旧内容,此规则实际上可能是您需要的唯一重定向规则。