Tengo una página web ( https://smartystreets.com/contact ) que usa jQuery para cargar algunos archivos SVG desde S3 a través de CloudFront CDN.
En Chrome abriré una ventana de incógnito, así como la consola. Luego cargaré la página. A medida que se carga la página, normalmente recibo de 6 a 8 mensajes en la consola que se parecen a esto:
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.
Si realizo una recarga estándar de la página, incluso varias veces, sigo recibiendo los mismos errores. Si lo hago Command+Shift+R
, la mayoría de las imágenes, y a veces todas, se cargarán sin el XMLHttpRequest
error.
A veces, incluso después de que las imágenes se hayan cargado, actualizaré y una o más de las imágenes no se cargarán y devolverán ese XMLHttpRequest
error nuevamente.
He verificado, cambiado y vuelto a comprobar la configuración en S3 y Cloudfront. En S3 mi configuración CORS se ve así:
<?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: inicialmente solo tenía el <AllowedOrigin>*</AllowedOrigin>
mismo problema).
En CloudFront el comportamiento de distribución está configurado para permitir los métodos HTTP: GET, HEAD, OPTIONS
. Los métodos en caché son los mismos. Reenviar encabezados se establece en "Lista blanca" y esa lista blanca incluye, "Acceso-Control-Solicitud-Encabezados, Acceso-Control-Solicitud-Método, Origen".
El hecho de que funcione después de una recarga del navegador sin caché parece indicar que todo está bien en el lado S3 / CloudFront, de lo contrario, ¿por qué se entregaría el contenido? Pero entonces, ¿por qué no se entregaría el contenido en la vista de página inicial?
Estoy trabajando en Google Chrome en macOS. Firefox no tiene problemas para obtener los archivos cada vez. Opera NUNCA obtiene los archivos. Safari recogerá las imágenes después de varias actualizaciones.
Usando curl
no tengo ningún 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==
Algunos han sugerido que elimine la distribución de CloudFront y la vuelva a crear. Parece una solución bastante dura e inconveniente.
que esta causando este problema?
Actualizar:
Agregar encabezados de respuesta de una imagen que no se pudo cargar.
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