我们最近将网站迁移到了Amazon S3(所有静态页面)。 我们将静态文件移动到另一个子域,该子域仍然指向我们的旧服务器。
除了一件事,一切都很可爱。
我们收到了一个仍然在主域上从旧客户端调用的脚本。 在新客户端上,URL已修复,但旧客户端仍在使用旧URL。
我发现我们可以按照http://docs.aws.amazon.com/AmazonS3/latest/dev/how-to-page-redirect.html中的说明管理Amazon S3中的重定向。这是有效的,除了我们丢失所有GET变量的事实。
有没有办法通过转发/保留GET变量来定义S3重定向? 我们怎样才能最好地解决这个问题呢?有什么想法吗?
答案 0 :(得分:7)
通过“获取数据”,听起来就像是指查询字符串 - 例如?foo=1&bar=2
- 位于您网址中的路径之后。当您执行对象级重定向时,S3会将其删除。
您可以使用routing rules将具有特定前缀的所有对象的请求重定向到其他网站,而不是重定向特定对象,并且只有在出现错误(例如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错误,因此这是您需要捕获的错误在重定向规则中。
答案 1 :(得分:0)
关键是使用ReplaceKeyPrefixWith
代替ReplaceKeyWith
。
例如,使用Gulp和gulp-awspublish
,配置为JSON。
所以来自:
Condition:
KeyPrefixEquals: 'us.html'
Redirect:
ReplaceKeyWith: 'about.html'
要
Condition:
KeyPrefixEquals: 'us.html'
Redirect:
ReplaceKeyPrefixWith: 'about.html'
将example.com/us.html?a=1
重定向到example.com/about.htmk?a=1
。
小心循环,例如
Condition:
KeyPrefixEquals: 'about'
Redirect:
ReplaceKeyPrefixWith: 'about.html'
通过添加.html.html.html
等来进行重定向循环。