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