28

我在 Amazon S3 上托管我想使用预签名 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 同一资源的签名?

4

3 回答 3

17

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

curl -r 0-0 <URL>

于 2016-09-23T14:22:23.070 回答
6

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

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

于 2013-03-30T21:26:53.150 回答
6

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

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

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

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

于 2014-01-12T21:31:11.563 回答