为什么从浏览器上传到 S3 时会出现 403 错误?
Why am I getting a 403 error when uploading to S3 from the browser?
所以我已经尝试在这里查看以前的答案,但似乎没有任何效果。我正在使用 Dropzone,它似乎发出了一个 OPTIONS 请求来获取所有允许的 CORS 相关信息,但它似乎没有正确返回
所以通过查看 Chrome 开发工具,我有以下请求 Headers
Host: mybucket.s3.amazonaws.com
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Access-Control-Request-Method: POST
Origin: http://localhost:9010
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36
Access-Control-Request-Headers: accept, cache-control, content-type, x-requested-with
Accept: */*
Referer: http://localhost:9010/upload
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
这些是我收到的回复Headers
HTTP/1.1 403 Forbidden
x-amz-request-id: 9BE37C4F32052EAB
x-amz-id-2: Zxg+v9AQ7G7sgMKz4P7xleUhrymyWGbBNNof8jFFsZ5n0Xw8T/mPovbMO55HZ5fL
Content-Type: application/xml
Transfer-Encoding: chunked
Date: Fri, 28 Aug 2015 18:35:26 GMT
Server: AmazonS3
根据 AWS documentation 我应该得到 Access-Control-Allow-Methods 和 Access-Control-Allow-Headers ,但我好像不是。
我知道我的bucket是有效的,url是有效的,我在bucket中的CORS文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
所以就发送的表单数据而言,我有以下内容:
acl
key
policy
x-amx-credential
x-amz-algorithm
x-amz-date
x-amz-signature
除了文件数据。我不认为我遗漏了什么
啊,太蠢了。根据 enabling CORS 上的页面看来,对于 OPTIONS 请求:
Every header listed in the request's Access-Control-Request-Headers header on the preflight request must match an AllowedHeader element.
这意味着我必须在我的 CORS 策略中添加一堆以前缺失的行
<AllowedHeader>accept</AllowedHeader>
<AllowedHeader>cache-control</AllowedHeader>
...
根据 docs on enabling cors,您应该可以简单地使用 *
,这样您就不必将它们全部列出:
<AllowedHeader>*</AllowedHeader>
如果有人遇到这个问题,403 可能会出现,因为设置了错误的 contentType。
服务器端:
GeneratePresignedUrlRequest rq = new GeneratePresignedUrlRequest(bucketName, objectKey);
rq.setContentType("video/*");
...
客户端:
$.ajax({
url:upUrl,
type: "PUT",
data: file,
contentType:'video/*',
cache: false,
processData:false,
success: function (data) {
}
});
所以我已经尝试在这里查看以前的答案,但似乎没有任何效果。我正在使用 Dropzone,它似乎发出了一个 OPTIONS 请求来获取所有允许的 CORS 相关信息,但它似乎没有正确返回
所以通过查看 Chrome 开发工具,我有以下请求 Headers
Host: mybucket.s3.amazonaws.com
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Access-Control-Request-Method: POST
Origin: http://localhost:9010
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36
Access-Control-Request-Headers: accept, cache-control, content-type, x-requested-with
Accept: */*
Referer: http://localhost:9010/upload
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
这些是我收到的回复Headers
HTTP/1.1 403 Forbidden
x-amz-request-id: 9BE37C4F32052EAB
x-amz-id-2: Zxg+v9AQ7G7sgMKz4P7xleUhrymyWGbBNNof8jFFsZ5n0Xw8T/mPovbMO55HZ5fL
Content-Type: application/xml
Transfer-Encoding: chunked
Date: Fri, 28 Aug 2015 18:35:26 GMT
Server: AmazonS3
根据 AWS documentation 我应该得到 Access-Control-Allow-Methods 和 Access-Control-Allow-Headers ,但我好像不是。
我知道我的bucket是有效的,url是有效的,我在bucket中的CORS文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
所以就发送的表单数据而言,我有以下内容:
acl
key
policy
x-amx-credential
x-amz-algorithm
x-amz-date
x-amz-signature
除了文件数据。我不认为我遗漏了什么
啊,太蠢了。根据 enabling CORS 上的页面看来,对于 OPTIONS 请求:
Every header listed in the request's Access-Control-Request-Headers header on the preflight request must match an AllowedHeader element.
这意味着我必须在我的 CORS 策略中添加一堆以前缺失的行
<AllowedHeader>accept</AllowedHeader>
<AllowedHeader>cache-control</AllowedHeader>
...
根据 docs on enabling cors,您应该可以简单地使用 *
,这样您就不必将它们全部列出:
<AllowedHeader>*</AllowedHeader>
如果有人遇到这个问题,403 可能会出现,因为设置了错误的 contentType。
服务器端:
GeneratePresignedUrlRequest rq = new GeneratePresignedUrlRequest(bucketName, objectKey);
rq.setContentType("video/*");
...
客户端:
$.ajax({
url:upUrl,
type: "PUT",
data: file,
contentType:'video/*',
cache: false,
processData:false,
success: function (data) {
}
});