我正在使用已签名的网址将文件直接从客户端直接上传到我的S3存储桶中。为此,我在创建了我想要执行的命令的签名URL后执行直接放置请求以上传文件。
我创建了这样的签名网址:
$command = $s3->getCommand('PutObject', array(
'Bucket' => $this->_bucket,
'Key' => $key,
'ACL' => 'public-read',
'CacheControl' => 'max-age=0',
'ContentEncoding' => 'gzip',
'ContentType' => $filetype,
'Body' => '',
'ContentMD5' => false
));
$signedUrl = $command->createPresignedUrl('+6 hours');
但是,在执行put请求并上传文件后,Cache-Control
和Content-Encoding
标头未设置。
有谁知道我哪里出错了?
答案 0 :(得分:2)
仍然必须在PUT
请求中设置标头。将它们包含在已签名的URL中是不够的。
预签名网址仅用于确保实际请求参数与授权请求参数匹配(否则请求失败)。
所以,如果我所说的是正确的,那么如果这些参数不随请求一起发送,那么它应该失败,对吗?几乎。
不幸的是,V2身份验证不会验证所有请求标头,例如Content-Encoding
:
请注意,只有Content-Type和Content-MD5 HTTP实体标头出现在StringToSign中。其他Content- *实体标题不会。
- http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html
Cache-Control
也是如此。只有x-amz-*
标头才能根据V2中提供的签名进行验证(在查询字符串中使用&Signature=
)。
V4 auth(相反,在查询字符串中使用&X-Amz-Signature=
)包含一种机制,允许您指定哪些标题需要针对签名进行验证,但在任何一种情况下,您都必须使用实际请求本身,而不仅仅是将它们包含在签名中。看来你不是,这就是他们没有被设置的原因。