允许使用Amazon S3的OPTIONS HTTP方法

5
我正在使用HTML5的CORS文件上传器与Amazon S3一起工作。它运行良好,但我仍然遇到了一个非常奇怪的问题。
在发送文件之前的PUT请求中,浏览器总是会发送一个OPTIONS请求,但其失败并返回403禁止错误代码。
但是文件确实已正确传输到S3,这是怎么回事?
我尝试通过启用所有HTTP方法来解决问题,但未成功。
以下是我用于PUT请求的标头:
AWSAccessKeyId:XXXXXXXXXXXXXXXXXXXXXX
Expires:1347882643
Signature:YYYYYYYYYYYYYYYYYYYYY

还有一些代码相关的内容:

var xhr = new XMLHttpRequest();
// bind the event listener
xhr.upload.addEventListener("progress", progress_listener, false);
// open the XMLHttpRequest 
xhr.open('PUT', signed_url, true);

// when the upload is completed call the callback function if supplied
xhr.onload = function(e) {
    if(typeof callback == "function") {
        callback(this.status == 200, file.name, file_id);
        confirm_upload_success(file_id);
    }
};

// start sending
xhr.send(file);

1
你是否正确设置了CORS?http://docs.amazonwebservices.com/AmazonS3/latest/dev/cors.html - Evert
当然,但是Amazon S3不允许您将OPTIONS放入允许的HTTP方法中。 - Olivier Kaisin
1个回答

4

编辑:此错误已被亚马逊修复 :-)

Carl@AWS / 2012年9月28日下午2:56:

大家好,

这个错误现在应该已经修复了,使用带有CORS的预签名URL将会成功。

谢谢!


您描述的问题是一个亚马逊的错误:S3目前正在验证CORS中“preflight”中进行的OPTION调用,并且失败了(可能是因为授权已经为PUT请求而不是OPTION请求进行签名)。

如您在此处所见,他们已经关注到了这个问题:CORS works with public data, but fails to work with pre-signed request

Carl@AWS / 2012年9月5日下午1:00:

感谢您和其他人的报告。您是正确的,预签名请求在初始OPTIONS请求上返回错误。我们正在解决这个问题,并期望很快添加此支持。我没有时间表来说明更改的可用性,但我会在有更多信息时更新此线程。如果您有任何后续问题,请让我知道。

所以只需忽略它,他们会修复它的。


但不要忘记在S3存储桶中更新CORS策略。使用默认策略,例如Postman中的PUT请求可以正常工作,但由于OPTIONS请求,它无法从浏览器中工作。 - Vyacheslav Tsivina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接