S3将所有请求重定向到请求url作为参数的索引

时间:2016-01-31 16:09:17

标签: amazon-web-services amazon-s3

我正在尝试设置一个S3存储桶来处理一组动态链接,然后重新定向它们。传入链接的结构类似deeplink.s3-website-eu-west-1.amazonaws.com/link1,我喜欢指向deeplink.s3-website-eu-west-1.amazonaws.com?url=link1。这是否可以在重定向规则中使用?

1 个答案:

答案 0 :(得分:5)

如果您希望S3从/link1重定向到?url=link1,那么就可以执行此操作:

<RoutingRules>
 <RoutingRule>
  <Condition>
   <KeyPrefixEquals></KeyPrefixEquals>
   <HttpErrorCodeReturnedEquals>403</HttpErrorCodeReturnedEquals>
  </Condition>
  <Redirect>
   <HostName>target.example.com</HostName>
   <ReplaceKeyPrefixWith>?uri=/</ReplaceKeyPrefixWith>
  </Redirect>
 </RoutingRule>
</RoutingRules>

这里的逻辑是,如果密钥前缀是零长度字符串,它始终是 - 每个字符串的最左边的0个字符是空字符串,无论字符串包含什么 - 并且错误代码将如果你没有给匿名用户许可列出对象(你不应该这样做)然后将?uri=/添加到密钥 - 那么它总是用于丢失对象 - 技术上,我们要求S3通过使用我们的前置字符串“替换”键中最左边的0个字符来执行此操作(同样,记住S3键实际上没有前导斜杠,所以在我的情况下,我添加/ - 如果你不想使用前导斜杠,只需使用?uri=)并重定向到目标主机。

在这个问题中,你提到重定向到同一个桶 - 不知道那会对你做什么,因为S3不会对该查询字符串做任何事情,并且在我的应用程序中,我重定向到另一个站点 - - 但是这个路由规则会执行您尝试执行的操作。

另一方面,如果您希望S3将?url=link1重定向到/link1,那么使用路由规则是不可能的,因为它们不会处理查询字符串。