我们最近将我们的网站迁移到了Amazon S3(所有静态页面).我们将静态文件移动到另一个子域,该子域仍然指向我们的旧服务器.
除了一件事,一切都很可爱.
我们得到了一个仍然从主域上的旧客户端调用的脚本.在新客户端上,URL已修复,但旧客户端仍在使用旧URL.
我发现我们可以在http://docs.aws.amazon.com/AmazonS3/latest/dev/how-to-page-redirect.html上描述的Amazon S3中管理重定向.这是有效的,除了我们丢失所有GET变量的事实.
有没有办法通过转发/保留GET变量来定义S3重定向?我们怎样才能最好地解决这个问题呢?有任何想法吗?
通过"获取数据",听起来你指的是查询字符串 - 例如?foo=1&bar=2
- 跟在URL中的路径之后.当您执行对象级重定向时,S3会将其删除.
您可以使用路由规则将具有特定前缀的所有对象的请求重定向到不同的网站,而不是重定向特定对象,并且可选地,只有在尝试提供服务时发生错误(例如404)时才可以执行此重定向.原始物体.使用此方法,查询字符串似乎始终保持不变.
要将每个不存在的对象重定向http://example.com/this/directory/*
到http://other-site.example.com/that/directory/*
您,请使用如下规则:
<RoutingRule> <Condition> <KeyPrefixEquals>this/directory/</KeyPrefixEquals> <HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals> </Condition> <Redirect> <Protocol>http</Protocol> <HostName>other-site.example.com</HostName> <ReplaceKeyPrefixWith>that/directory/</ReplaceKeyPrefixWith> </Redirect> </RoutingRule>
<HttpErrorCodeReturnedEquals>
如果要将匹配该前缀的每个对象请求重定向到其他站点,则不需要,即使该对象已存在于配置规则的存储桶中也是如此. 如果您不需要重写路径前缀,则<ReplaceKeyPrefixWith>
可以设置为相同的值<KeyPrefixEquals>
或可能完全省略.
请注意,在前缀相关选项中不使用前导斜杠.
另请注意,您要使用的正确值<HttpErrorCodeReturnedEquals>
可能是403("禁止")而不是404("未找到").S3中的对象可以通过桶级或对象级权限公开.如果存储桶本身不是可公开读取的,则如果对象的权限是单独设置的,则对象仍然可以.当桶本身不可公开读取时,(iirc)S3将不会确认对象是否存在,在未经身份验证的请求上使用404,而是生成403错误,因此这是您需要捕获的错误在重定向规则中.