Ich habe eine Webseite ( https://smartystreets.com/contact ), die jQuery verwendet, um einige SVG-Dateien von S3 über das CloudFront-CDN zu laden.
In Chrome öffne ich ein Inkognito-Fenster sowie die Konsole. Dann lade ich die Seite. Beim Laden der Seite werden in der Regel 6 bis 8 Meldungen in der Konsole angezeigt, die ungefähr so aussehen:
XMLHttpRequest cannot load
https://d79i1fxsrar4t.cloudfront.net/assets/img/feature-icons/documentation.08e71af6.svg.
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'https://smartystreets.com' is therefore not allowed access.
Wenn ich die Seite mehrmals standardmäßig neu lade, werden weiterhin dieselben Fehler angezeigt. Wenn ich das tue, werden die Command+Shift+R
meisten und manchmal alle Bilder ohne XMLHttpRequest
Fehler geladen .
Manchmal aktualisiere ich sogar nach dem Laden der Bilder, und eines oder mehrere der Bilder werden nicht geladen und geben diesen XMLHttpRequest
Fehler erneut zurück.
Ich habe die Einstellungen in S3 und Cloudfront überprüft, geändert und erneut überprüft. In S3 sieht meine CORS Konfiguration so aus:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedOrigin>http://*</AllowedOrigin>
<AllowedOrigin>https://*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
(Hinweis: hatte anfangs nur das <AllowedOrigin>*</AllowedOrigin>
gleiche Problem.)
In Cloudfront ist das Verteilungsverhalten der HTTP - Methoden ermöglichen gesetzt: GET, HEAD, OPTIONS
. Die zwischengespeicherten Methoden sind dieselben. Forward Headers ist auf "Whitelist" gesetzt und diese Whitelist enthält "Access-Control-Request-Headers, Access-Control-Request-Method, Origin".
Die Tatsache, dass es nach einem Browser-Reload ohne Cache funktioniert, scheint darauf hinzudeuten, dass auf der S3 / CloudFront-Seite alles in Ordnung ist. Andernfalls wird der Inhalt geliefert. Aber warum wird der Inhalt dann nicht auf der ersten Seite angezeigt?
Ich arbeite in Google Chrome auf MacOS. Firefox hat kein Problem damit, die Dateien jedes Mal abzurufen. Opera bekommt NIE die Dateien. Safari nimmt die Bilder nach mehreren Aktualisierungen auf.
Mit curl
bekomme ich keine Probleme:
curl -I -H 'Origin: smartystreets.com' https://d79i1fxsrar4t.cloudfront.net/assets/img/phone-icon-outline.dc7e4079.svg
HTTP/1.1 200 OK
Content-Type: image/svg+xml
Content-Length: 508
Connection: keep-alive
Date: Tue, 20 Jun 2017 17:35:57 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET
Access-Control-Max-Age: 3000
Last-Modified: Thu, 15 Jun 2017 16:02:19 GMT
ETag: "dc7e4079f937e83291f2174853adb564"
Cache-Control: max-age=31536000
Expires: Wed, 01 Jan 2020 23:59:59 GMT
Accept-Ranges: bytes
Server: AmazonS3
Vary: Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age: 4373
X-Cache: Hit from cloudfront
Via: 1.1 09fc52f58485a5da8e63d1ea27596895.cloudfront.net (CloudFront)
X-Amz-Cf-Id: wxn_m9meR6yPoyyvj1R7x83pBDPJy1nT7kdMv1aMwXVtHCunT9OC9g==
Einige haben vorgeschlagen, die CloudFront-Distribution zu löschen und neu zu erstellen. Scheint eine ziemlich harte und unbequeme Lösung zu sein.
Was verursacht dieses Problem?
Aktualisieren:
Hinzufügen von Antwortheadern aus einem Bild, das nicht geladen werden konnte.
age:1709
cache-control:max-age=31536000
content-encoding:gzip
content-type:image/svg+xml
date:Tue, 20 Jun 2017 17:27:17 GMT
expires:2020-01-01T23:59:59.999Z
last-modified:Tue, 11 Apr 2017 18:17:41 GMT
server:AmazonS3
status:200
vary:Accept-Encoding
via:1.1 022c901b294fedd7074704d46fce9819.cloudfront.net (CloudFront)
x-amz-cf-id:i0PfeopzJdwhPAKoHpbCTUj1JOMXv4TaBgo7wrQ3TW9Kq_4Bx0k_pQ==
x-cache:Hit from cloudfront