Ho una pagina web ( https://smartystreets.com/contact ) che utilizza jQuery per caricare alcuni file SVG da S3 attraverso la CDN CloudFront.
In Chrome aprirò una finestra di navigazione in incognito e la console. Quindi caricherò la pagina. Man mano che la pagina viene caricata, riceverò in genere da 6 a 8 messaggi nella console simili a questo:
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.
Se eseguo un ricaricamento standard della pagina, anche più volte, continuo a ricevere gli stessi errori. Se lo faccio Command+Shift+R
, la maggior parte, e talvolta tutte, delle immagini verranno caricate senza XMLHttpRequest
errori.
A volte anche dopo che le immagini sono state caricate, mi aggiorno e una o più immagini non si caricano e restituiscono di XMLHttpRequest
nuovo quell'errore.
Ho controllato, modificato e ricontrollato le impostazioni su S3 e Cloudfront. In S3 la mia configurazione CORS è simile alla seguente:
<?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>
(Nota: inizialmente aveva solo lo <AllowedOrigin>*</AllowedOrigin>
stesso problema.)
Nel CloudFront il comportamento di distribuzione è impostato per consentire i metodi HTTP: GET, HEAD, OPTIONS
. I metodi memorizzati nella cache sono gli stessi. Forward Headers è impostato su "Whitelist" e tale whitelist include "Access-Control-Request-Headers, Access-Control-Request-Method, Origin".
Il fatto che funzioni dopo un ricaricamento del browser senza cache sembra indicare che tutto va bene sul lato S3 / CloudFront, altrimenti perché il contenuto dovrebbe essere consegnato. Ma allora perché il contenuto non dovrebbe essere consegnato nella visualizzazione della pagina iniziale?
Sto lavorando in Google Chrome su macOS. Firefox non ha problemi a recuperare i file ogni volta. Opera non ottiene MAI i file. Safari raccoglierà le immagini dopo diversi aggiornamenti.
Utilizzando curl
non ottengo alcun problema:
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==
Alcuni hanno suggerito di eliminare la distribuzione CloudFront e ricrearla. Sembra una soluzione piuttosto dura e scomoda.
Cosa causa questo problema?
Aggiornare:
Aggiunta di intestazioni di risposta da un'immagine che non è stata caricata.
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