2017-12-02 256 views
2

使用webpack運行開發服務器,我試圖列出S3存儲桶中的項目,並在瀏覽器中使用javascript aws-sdk控制檯輸出結果。aws-sdk抱怨實際存在的cors頭缺失

這樣做時,我得到這個錯誤:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://bucketname.s3.amazonaws.com/?list-type=2&max-keys=2. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing). 

但是我有一個頭在的WebPack開發服務器的配置設置,以證明:

curl -I http://localhost:8080 

HTTP/1.1 200 OK 
X-Powered-By: Express 
Access-Control-Allow-Origin: * 
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, PATCH, OPTIONS 
Access-Control-Allow-Headers: X-Requested-With, content-type, Authorization 
X-Content-Type-Options: nosniff 
Content-Type: text/html; charset=utf-8 
Content-Length: 7170 
Vary: Accept-Encoding 
Date: Sat, 02 Dec 2017 16:15:04 GMT 
Connection: keep-alive 

所以,我想*的一切:

HTTP/1.1 404 Not Found 
X-Powered-By: Express 
Access-Control-Allow-Origin: * 
Access-Control-Allow-Methods: * 
Access-Control-Allow-Headers: * 

如果標題在那裏,錯誤是說它的缺失,它可以是授權的東西嗎?

如果它確實是標題設置,如果標題實際存在,下一步是什麼?

最新通報****

1:添加CORS S3上設置,雖然我相信它的頭抱怨不會在S3:

<?xml version="1.0" encoding="UTF-8"?> 
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
<CORSRule> 
    <AllowedOrigin>*</AllowedOrigin> 
    <AllowedMethod>GET</AllowedMethod> 
    <MaxAgeSeconds>3000</MaxAgeSeconds> 
    <AllowedHeader>Authorization</AllowedHeader> 
</CORSRule> 
</CORSConfiguration> 

也鬥不公開或啓用靜態主機。

2:這工作:

<?xml version="1.0" encoding="UTF-8"?> 
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
<CORSRule> 
    <AllowedOrigin>*</AllowedOrigin> 
    <AllowedMethod>GET</AllowedMethod> 
    <AllowedMethod>PUT</AllowedMethod> 
    <AllowedMethod>POST</AllowedMethod> 
    <AllowedMethod>DELETE</AllowedMethod> 
    <AllowedHeader>*</AllowedHeader> 
    <MaxAgeSeconds>3000</MaxAgeSeconds> 
    <AllowedHeader>Authorization</AllowedHeader> 
</CORSRule> 
</CORSConfiguration> 

從URL被標記的答案給出

+0

它抱怨在S3桶CORS設定阻塞該請求。它與你的dev服務器上的CORS配置無關。您需要在下面的答案中的鏈接之後,在S3存儲桶上配置CORS。 –

+0

@MarkB id有興趣學習如何正確讀取錯誤信息。我對它的閱讀完全不同。我認爲這將在未來幫助我,除非您同意它有明確的需求。 –

+0

它與錯誤信息中的措辭較少有關,更多與理解CORS的工作方式有關。當您在託管在另一個域中的網頁中包含某些內容時,瀏覽器會向域中查看是否可以將它們的內容包含在網頁中(通過檢查CORS標頭)。 CORS不是告訴瀏覽器哪些域可以顯示在你的頁面中,CORS是告訴瀏覽器其他域是否可以包含你的內容。因此,您的服務器的CORS配置與您遇到的問題無關,必須在S3上進行配置。 –

回答

1

您在S3存儲桶配置上設置了CORS。在AWS管理控制檯上登錄。去S3桶;在右邊你會發現選項

1

的原因,你的第一個例子沒有工作是這個CORS常見的請求頭:

<AllowedHeader>Authorization</AllowedHeader> 

Common Request Headers

基本上你有你的CORS策略寫入的方式是,所有的請求要求授權標題存在。例如:

Authorization: AWS AWSAccessKeyId:Signature 

的解決方案是將其改爲:

<AllowedHeader>*</AllowedHeader> 

How Does Amazon S3 Evaluate the CORS Configuration On a Bucket?

When Amazon S3 receives a preflight request from a browser, it evaluates the CORS configuration for the bucket and uses the first CORSRule rule that matches the incoming browser request to enable a cross-origin request. For a rule to match, the following conditions must be met:

  • 請求的來源頭必須的AllowedOrigin元件相匹配。
  • 在預檢OPTIONS請求的情況下,請求方法(例如,GET或PUT)或Access-Control-Request-Method標頭必須是AllowedMethod元素之一。
  • 預檢規範請求中的請求的Access-Control-Request-Headers標頭中列出的每個標頭必須與AllowedHeader元素相匹配。

Cross-Origin Resource Sharing (CORS)