2013-07-10 5 views
22

Ich habe Probleme, S3 zu zwingen, CORS-Header für alle Objekte zu setzen, die es aus einem Bucket zurückgibt, obwohl CORS aktiviert ist, da clientseitige S3-Uploads funktionieren, die zurückgegebenen Objekte haben keine CORS-Header!S3 gibt Access-Control-Allow-Origin-Header nicht zurück?

Die Politik I aktiviert haben ist:

<?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> 
     <AllowedHeader>*</AllowedHeader> 
    </CORSRule> 
</CORSConfiguration> 

Ein Beispiel Objekt URL https://s3.amazonaws.com/captionable/meme/test

Wer weiß, was falsch ist?

Antwort

28

Zuerst sicherstellen, dass ein Origin Header mit jeder Anfrage. Wenn kein Header Origin gesendet wird, sendet S3 keine Header access-control, da S3 sie für irrelevant hält (und normalerweise sind sie es). Ein Browser (für den der CORS-Mechanismus gemeint ist) sendet automatisch einen Origin Header, wenn Ursprungs-HTTP-Anfragen über XMLHTTPRequest durchgeführt werden. Wenn Sie Bilder mit img laden, müssen Sie das Attribut crossorigin="anonymous" hinzufügen. Siehe MDN Documentation on crossorigin attribute. Dies veranlasst den Browser, einen Anforderungsheader Origin wie bei XMLHTTPRequest zu senden.

durch die Antwort von Sam Selikoff gehen, müssen Sie

<AllowedOrigin>http://*</AllowedOrigin> 

zu

<AllowedOrigin>http://*</AllowedOrigin> 
<AllowedOrigin>https://*</AllowedOrigin> 

ich nicht getestet haben, ändern.

Geht nach Paul Drapers Kommentar zu dieser Antwort: Achten Sie auf Caching-Probleme. Ein Browser verwendet möglicherweise eine zwischengespeicherte Antwort, die die entsprechenden Antwortkopfzeilen Access-Control nicht enthielt. Während der Entwicklung können Sie Ihren Cache löschen. In der Produktion müssen Sie zu einer neuen URL für die Ressource wechseln, wenn sie zuvor statisch verwendet wurde.

+3

Und darin liegt der Haken. Ich habe ein Image-Tag erstellt, das keine Origin-Header sendet. Das heißt, ich erwartete, dass S3 immer CORS-Header zurückgibt, obwohl dies nur geschieht, wenn 'Origin' angegeben ist. Danke für die Bestätigung, dass CORS richtig konfiguriert ist. –

+0

In diesem Fall scheint es, dass ich das crossOrigin-Attribut eines Image-Tags setzen sollte. Kennst du zufällig die Sup –

+2

Ich habe keine Erfahrung mit diesem Attribut. Wenn Sie "anonymous" festlegen, wird der Browser möglicherweise veranlasst, den Header "Origin" zu senden. Vielleicht separate Frage? –

24

Ich lief auch in diesem mit einem <image> Tag, und nachdem ich Myrne Stol's Antwort folgte, fügte ich das crossorigin=anonymous Tag zu meinem Image-Tag hinzu. Ich verifizierte, dass der Header Origin tatsächlich an S3 gesendet wurde, aber der Header Access-Control-Allow-Origin wurde nicht als Antwort gesendet.

Ich stieß auf this SO answer und es löste es. Ich habe die AllowedOrigin in meinem S3 config dies:

<AllowedOrigin>http://*</AllowedOrigin> 
<AllowedOrigin>https://*</AllowedOrigin> 

und jetzt S3 reagiert mit den Zugriffs Header. Yay!

+2

das ist es !!!!! Ich habe mich immer gefragt, warum * kors Regeln nicht funktioniert haben! – rupps

+2

@ cory-dolphin Ich denke, das sollte die akzeptierte Antwort hier sein. Ich hatte auch das gleiche Problem mit dem Bild-Tag und das Hinzufügen dieser beiden Zeilen repariert es. – supersan

+2

danke, ist die beste Antwort –

Verwandte Themen