Redirect Amazon S3重定向规则-缺少获取数据

Redirect Amazon S3重定向规则-缺少获取数据,redirect,amazon-web-services,amazon-s3,amazon,Redirect,Amazon Web Services,Amazon S3,Amazon,我们最近将网站移至AmazonS3(所有静态页面)。 我们将所有静态文件移动到另一个子域,该子域仍然指向旧服务器 除了一件事,一切都很顺利 我们得到了一个脚本,它仍在从主域上的旧客户端调用。 在新客户端上,URL是固定的,但旧客户端仍在使用旧URL 我发现我们可以在AmazonS3中管理重定向,如中所述。这是有效的,除了我们失去了所有GET变量 有没有办法通过转发/保留GET变量来定义S3重定向? 我们如何才能最好地解决这个问题?任何想法?通过“获取数据”,听起来像是指URL路径后面的查询字符串

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

除了一件事,一切都很顺利

我们得到了一个脚本,它仍在从主域上的旧客户端调用。 在新客户端上,URL是固定的,但旧客户端仍在使用旧URL

我发现我们可以在AmazonS3中管理重定向,如中所述。这是有效的,除了我们失去了所有GET变量

有没有办法通过转发/保留GET变量来定义S3重定向? 我们如何才能最好地解决这个问题?任何想法?

通过“获取数据”,听起来像是指URL路径后面的查询字符串,例如
?foo=1&bar=2
。当您执行对象级重定向时,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>

此目录为/directory/
404
http
other-site.example.com
那个/目录/
如果要将与该前缀匹配的每个对象请求重定向到其他站点,即使该对象已存在于配置规则的bucket中,也不需要使用
<代码>可以设置为与
相同的值,或者如果不需要重写路径前缀,可以完全忽略

请注意,在前缀相关选项中不使用前导斜杠


还要注意的是,您希望用于
的正确值可能是403(“禁止”),而不是404(“未找到”)。S3中的对象可以通过bucket级别或对象级别权限公开。如果bucket本身不是公共可读的,那么对象仍然可以,如果它们的权限是单独设置的。当bucket本身不可公开读取时,(iirc)S3将不会确认对象是否存在,在未经验证的请求上使用404,而是生成403错误,这就是您需要在重定向规则中捕获的错误。

关键是使用
ReplaceKeyPrefixWith
而不是
ReplaceKeyWith

例如,使用Gulp和
gulpawspublish
,配置是JSON格式的

因此,从:

Condition:
  KeyPrefixEquals: 'us.html'
Redirect:
  ReplaceKeyWith: 'about.html'

将使
example.com/us.html?a=1
重定向到
example.com/about.htmk?a=1

小心环(如)

Condition:
  KeyPrefixEquals: 'about'
Redirect:
  ReplaceKeyPrefixWith: 'about.html'

将通过添加
.html.html.html
等进行重定向循环。

太棒了!使用重定向确实是在保存URL参数。将代码调整为只在一个文件上工作,它也是403,因为AmazonS3给出了“无权限”而不是“未找到”,但有了它,它似乎可以正常工作:)谢谢!杰出的谢谢你提到403。。。我似乎还记得以前也遇到过。我相信当bucket中的对象的公共可读性是使用对象级别而不是bucket级别的权限设置时,就会出现这种情况。更新了答案。@Michael sqlbot查询字符串似乎不再被保留。有什么想法吗?@arasmussen我无法复制你所描述的。我刚刚针对我的一个bucket进行了测试,可以验证使用重定向规则的bucket的行为是否仍然与这里的信息一致。请求中的查询字符串仍保留在
位置:
标题中返回的重写URL中。您能捕获curl-v[url]的输出吗?我可能可以在这里解决这个问题,或者我们可能需要一个新问题,这取决于您的发现。@Michael sqlbot解决了这个问题!我已将CloudFront配置为不转发查询字符串。谢谢你的回复!看到了吗?你可以在yaml中发布1或2个级别吗?文档中的键完全不同。。。
Condition:
  KeyPrefixEquals: 'about'
Redirect:
  ReplaceKeyPrefixWith: 'about.html'