我正在使用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的签名?
答案 0 :(得分:8)
如果仅为第一个字节指定HEAD
标头,还可以使用GET
模拟Range
行为。不同之处在于您收到206
而不是200
代码。其次,完整大小将位于Content-Range
标题中。
curl -I -H "Range: bytes=0-0" <URL>
答案 1 :(得分:5)
没有。 HEAD
和GET
需要不同的签名,因为签名输入存在细微差别。
不确定您用于生成预签名身份验证网址的内容,但我知道某些官方AWS软件开发工具包处理此问题,而其他人则尚未。
答案 2 :(得分:5)
在朋友的帮助下,我找到了一个适合我的解决方案:在我的服务器上代理HEAD请求,并重定向到GET请求。
当一个请求带有HEAD动词来获取文件信息时,我在我的服务器上使用我的S3代码来获取HEAD信息,然后我自己将它发送回请求者。
当请求带有GET动词以获取文件本身时,我会使用预先签名的URL进行302重定向。
这非常适合处理HEAD和GET而不需要预先签名。我只预先签署了实际文件的GET请求。