簡體   English   中英

從瀏覽器上傳到S3時為什么會出現403錯誤?

[英]Why am I getting a 403 error when uploading to S3 from the browser?

因此,我嘗試瀏覽此處的先前答案,但似乎沒有任何效果。 我正在使用Dropzone,它似乎發出了一個OPTIONS請求,以獲取所有允許的CORS相關信息,但是它似乎沒有正確返回

因此,通過查看Chrome開發者工具,我可以看到以下請求標頭

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

這些是我得到的響應標題

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文檔,我應該在其中獲得Access-Control-Allow-MethodsAccess-Control-Allow-Header ,但似乎不是。

我知道我的存儲桶有效,並且網址有效,並且存儲桶中的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

除了文件數據。 我不認為有什么我想念的

啊,真是愚蠢。 似乎在啟用CORS的頁面上顯示了針對OPTIONS請求的信息:

預檢請求中請求的Access-Control-Request-Headers頭中列出的每個頭都必須與AllowedHeader元素匹配。

這意味着我必須在CORS政策中添加一些以前缺少的行

<AllowedHeader>accept</AllowedHeader>
<AllowedHeader>cache-control</AllowedHeader>
...

根據有關啟用cors文檔 ,您應該能夠簡單地使用*因此不必全部列出它們:

<AllowedHeader>*</AllowedHeader>

如果有人為此苦惱,則可能會因為設置了錯誤的contentType而出現403。

服務器端:

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) {

                }
              });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM