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

doj*_*rge 1 amazon-s3 amazon-web-services

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

Mic*_*bot 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>
Run Code Online (Sandbox Code Playgroud)

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

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


另一方面,如果您希望S3重定向?url=link1/link1,那么路由规则就不可能,因为它们不处理查询字符串.