【问题标题】:Pre-signing Amazon S3 urls for both head and get verbs为 head 和 get 动词预签名 Amazon S3 url
【发布时间】:2013-03-20 23:31:21
【问题描述】:

我在 Amazon S3 上托管文件,我想使用 pre-signed urls 访问这些文件。

对于简单的 GET 请求,这非常有效。然而,有一些客户端首先执行 HEAD 请求(以检索文件大小)。由于 URL 中的签名包含 http 动词(GET 与 HEAD),因此头部请求失败。

客户只是这样做:

HEAD http://(bucketname).s3.amazonaws.com/filename?AWSAccessKeyId=(mykey)&Expires=(timestamp)&Signature=(sig)
GET http://(bucketname).s3.amazonaws.com/filename?AWSAccessKeyId=(mykey)&Expires=(timestamp)&Signature=(sig)

我无法更改客户端以使用不同的 URL 作为 head 和 get。有没有办法让亚马逊使用同时接受 HEAD 和 GET 获取同一资源的签名?

【问题讨论】:

  • 我遇到了同样的问题,真的需要解决这个问题。你有没有找到解决这个问题的方法?

标签: amazon-s3 amazon


【解决方案1】:

如果您只为第一个字节指定Range 标头,您还可以使用GET 模拟HEAD 行为。不同之处在于您收到的是206 而不是200 代码。其次,全尺寸将在 Content-Range 标头中。

curl -r 0-0 <URL>

【讨论】:

  • 我认为应该是curl -H "Range: bytes=0-0" <URL>,即没有-I,因为仍然会发出HEAD 请求并导致403(至少对我而言)。
  • Curl 有 -r 标志来指定范围,所以你可以这样做:curl -r 0-0 <URL>
【解决方案2】:

没有。 HEADGET 需要不同的签名,因为签名输入存在细微差别。

不确定您使用什么来生成预签名的身份验证 URL,但我知道一些官方的 AWS 开发工具包可以处理这个问题,而其他的还没有

【讨论】:

  • 你是说你知道一些 SDK 支持多个动词吗?哪个?还是我误会了?
【解决方案3】:

在朋友的帮助下,我找到了一个适合我的解决方案:在我的服务器上代理 HEAD 请求,并重定向 GET 请求。

当请求带有 HEAD 动词以获取文件信息时,我使用服务器上的 S3 代码获取 HEAD 信息,然后我自己将其发送回请求者。

当请求带有 GET 动词以获取文件本身时,我会使用预签名的 URL 进行 302 重定向。

这可以完美地处理 HEAD 和 GET,无需预先签名。我只对实际文件的 GET 请求进行预签名。

【讨论】:

  • 这是一个有效的解决方法,但它使我的服务器成为客户端和 s3 之间的瓶颈,我试图通过使用预签名 URL 来避免这种情况
猜你喜欢
  • 2018-12-27
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 2012-03-04
  • 2018-12-26
  • 2012-03-24
相关资源
最近更新 更多