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

Posted

技术标签:

【中文标题】Amazon S3 重定向规则 - 缺少 GET 数据【英文标题】:Amazon S3 Redirect rule - GET data is missing 【发布时间】:2014-07-22 12:29:10 【问题描述】:

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

除了一件事,一切都很好。

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

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

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

【问题讨论】:

【参考方案1】:

通过“获取数据”,听起来您指的是查询字符串——例如?foo=1&bar=2 -- 遵循您 URL 中的路径。当您执行对象级重定向时,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>
如果您想将匹配该前缀的每个对象请求重定向到其他站点,则不需要

&lt;HttpErrorCodeReturnedEquals&gt;,即使该对象已存在于配置规则的存储桶中。 &lt;ReplaceKeyPrefixWith&gt; 可以设置为与&lt;KeyPrefixEquals&gt; 相同的值,或者可以完全省略,如果您不需要重写路径前缀。

请注意,您不要在与前缀相关的选项中使用前导斜杠。

另请注意,您要为 &lt;HttpErrorCodeReturnedEquals&gt; 使用的正确值可能是 403(“禁止”)而不是 404(“未找到”)。 S3 中的对象可以通过存储桶级或对象级权限公开。如果存储桶本身不是公开可读的,则对象仍然可以公开读取,前提是它们的权限是单独设置的。当存储桶本身不是公开可读时,(iirc)S3 将不会确认对象是否存在,在未经身份验证的请求上使用 404,而是会生成 403 错误,因此这是您需要捕获的错误在重定向规则中。

【讨论】:

太棒了!使用重定向确实可以保存 URL 参数。将代码调整为仅适用于一个文件,它也是 403,因为 Amazon S3 给出“无权限”而不是未找到,但这样看来,它似乎可以正常工作:) 谢谢! 优秀。谢谢你提到 403 ......我似乎记得以前也遇到过。我相信,当存储桶中对象的公共可读性使用对象级别而不是存储桶级别权限设置时,情况就是如此。更新了答案。 @Michael-sqlbot 查询字符串似乎不再保留。有什么想法吗? @arasmussen 我无法复制您所描述的内容。我刚刚对我的一个存储桶进行了测试,并且可以验证使用重定向规则的存储桶的行为仍然与此处的信息一致。来自请求的查询字符串仍保留在 Location: 标头中返回的重写 URL 中。你能捕捉到curl -v [url] 的输出吗?我可以在这里解决它,或者我们可能需要一个新问题,这取决于你发现了什么。 @Michael-sqlbot 想通了!我将 CloudFront 配置为不转发查询字符串。不过感谢您的回复!见***.com/questions/30775068/…【参考方案2】:

关键是使用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 等来进行重定向循环。

【讨论】:

您能在此处的 yaml 中发布 1 或 2 个级别吗?文档中的键完全不同...

以上是关于Amazon S3 重定向规则 - 缺少 GET 数据的主要内容,如果未能解决你的问题,请参考以下文章

Amazon S3 重定向和 Cloudfront

为 301 重定向配置 Amazon 重定向规则

AWS CloudFront 如何遵循 S3 存储桶重定向规则?

通过 iframe 上传 Amazon S3

AWS 负载均衡器 - 无法添加 https 重定向/规则部分不可用

Amazon S3 - HTTPS/SSL - 有可能吗? [关闭]