为头部和动词预先签署Amazon S3网址

时间:2013-03-30 10:01:02

标签: amazon-s3 amazon

我正在使用pre-signed urls在Amazon S3上托管我想要访问的文件。

对于简单的GET请求,这非常有效。然而,有一些客户端首先执行HEAD请求(以检索文件大小)。由于URL中的签名包含http动词(GET vs 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的签名?

3 个答案:

答案 0 :(得分:8)

如果仅为第一个字节指定HEAD标头,还可以使用GET模拟Range行为。不同之处在于您收到206而不是200代码。其次,完整大小将位于Content-Range标题中。

curl -I -H "Range: bytes=0-0" <URL>

答案 1 :(得分:5)

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

不确定您用于生成预签名身份验证网址的内容,但我知道某些官方AWS软件开发工具包处理此问题,而其他人则尚未

答案 2 :(得分:5)

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

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

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

这非常适合处理HEAD和GET而不需要预先签名。我只预先签署了实际文件的GET请求。