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

Ivo*_*sch 22 amazon amazon-s3

我在Amazon S3上托管文件,我希望使用预先签名的URL进行访问.

对于简单的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)
Run Code Online (Sandbox Code Playgroud)

我不能改变客户端使用不同的URL来获取头部.有没有办法让亚马逊使用同一资源接受HEAD和GET的签名?

okr*_*asz 10

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

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

  • 我认为这应该是 `curl -H "Range: bytes=0-0" &lt;URL&gt;`,即没有 `-I`,因为它仍然执行 `HEAD` 请求并导致 403(对我来说,在至少)。 (2认同)

Rya*_*man 5

号的HEADGET需要不同的签名,有签名中输入细微的差别.

不确定您使用什么来生成预签名的身份验证URL,但我知道一些官方AWS SDK处理此问题,而其他人尚未处理.

  • 你是说你知道一些SDK支持多个动词吗?哪个?还是我误会了? (2认同)

Der*_*ley 5

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

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

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

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

  • 这是一个有效的解决方法,但它使我的服务器成为客户端和 s3 之间的瓶颈,我试图通过使用预签名 URL 来避免这种情况 (2认同)