Mam stronę internetową ( https://smartystreets.com/contact ), która używa jQuery do ładowania niektórych plików SVG z S3 za pośrednictwem CDN CloudFront.
W Chrome otworzę okno Incognito oraz konsolę. Następnie załaduję stronę. Gdy strona się ładuje, zazwyczaj w konsoli pojawia się od 6 do 8 wiadomości, które wyglądają podobnie do tego:
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.
Jeśli wykonam standardowe ładowanie strony, nawet wielokrotnie, nadal pojawiają się te same błędy. Jeśli to zrobię, Command+Shift+R
większość, a czasem wszystkie obrazy zostaną załadowane bez XMLHttpRequest
błędu.
Czasami nawet po załadowaniu obrazów odświeżę się, a jeden lub więcej obrazów nie załaduje się i nie zwróci XMLHttpRequest
ponownie tego błędu.
Sprawdziłem, zmieniłem i ponownie sprawdziłem ustawienia S3 i Cloudfront. W S3 moja konfiguracja CORS wygląda następująco:
<?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>
(Uwaga: początkowo miał tylko ten <AllowedOrigin>*</AllowedOrigin>
sam problem).
W CloudFront zachowanie dystrybucja jest ustawiony, aby umożliwić metod HTTP: GET, HEAD, OPTIONS
. Metody buforowane są takie same. Przekazywanie nagłówków jest ustawione na „Biała lista”, a ta biała lista zawiera „Nagłówki kontroli dostępu, nagłówki żądania, metoda kontroli dostępu, pochodzenie”.
Fakt, że działa po ponownym załadowaniu przeglądarki bez pamięci podręcznej, wydaje się wskazywać, że wszystko jest dobrze po stronie S3 / CloudFront, w przeciwnym razie dlaczego treść miałaby być dostarczona. Ale dlaczego więc treść nie byłaby dostarczana przy pierwszym wyświetleniu strony?
Pracuję w Google Chrome na macOS. Firefox nie ma problemu z otrzymywaniem plików za każdym razem. Opera NIGDY nie pobiera plików. Safari zbierze obrazy po kilku odświeżeniach.
Korzystanie curl
Nie mam żadnych problemów:
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==
Niektórzy sugerują, że usunę dystrybucję CloudFront i odtworzę ją. Wydaje się to dość trudnym i niewygodnym rozwiązaniem.
Co powoduje ten problem?
Aktualizacja:
Dodanie nagłówków odpowiedzi z obrazu, którego nie udało się załadować.
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