Amazon S3重定向规则 - 缺少GET数据

时间:2014-06-02 11:41:14

标签: redirect amazon-web-services amazon-s3 amazon

我们最近将网站迁移到了Amazon S3(所有静态页面)。 我们将静态文件移动到另一个子域,该子域仍然指向我们的旧服务器。

除了一件事,一切都很可爱。

我们收到了一个仍然在主域上从旧客户端调用的脚本。 在新客户端上,URL已修复,但旧客户端仍在使用旧URL。

我发现我们可以按照http://docs.aws.amazon.com/AmazonS3/latest/dev/how-to-page-redirect.html中的说明管理Amazon S3中的重定向。这是有效的,除了我们丢失所有GET变量的事实。

有没有办法通过转发/保留GET变量来定义S3重定向? 我们怎样才能最好地解决这个问题呢?有什么想法吗?

2 个答案:

答案 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等来进行重定向循环。