Eu tenho uma página da Web ( https://smartystreets.com/contact ) que usa o jQuery para carregar alguns arquivos SVG do S3 através da CDN do CloudFront.
No Chrome, vou abrir uma janela de navegação anônima e o console. Então eu carregarei a página. À medida que a página é carregada, normalmente recebo de 6 a 8 mensagens no console com aparência semelhante a esta:
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 eu fizer uma recarga padrão da página, mesmo várias vezes, continuarei recebendo os mesmos erros. Se o fizer Command+Shift+R
, a maioria e, às vezes, todas as imagens serão carregadas sem o XMLHttpRequest
erro.
Às vezes, mesmo após o carregamento das imagens, eu atualizo e uma ou mais imagens não são carregadas e retornamos esse XMLHttpRequest
erro novamente.
Verifiquei, alterei e verifiquei novamente as configurações do S3 e do Cloudfront. No S3, minha configuração do CORS se parece com isso:
<?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 tinha apenas o <AllowedOrigin>*</AllowedOrigin>
mesmo problema.)
Em CloudFront o comportamento de distribuição está definido para permitir que os métodos HTTP: GET, HEAD, OPTIONS
. Métodos em cache são os mesmos. Encaminhar cabeçalhos é definido como "Lista de permissões" e essa lista de permissões inclui "Cabeçalhos de solicitação de controle de acesso, Método de solicitação de controle de acesso, Origem".
O fato de funcionar após uma recarga de navegador sem cache parece indicar que tudo está bem no lado do S3 / CloudFront; caso contrário, por que o conteúdo seria entregue. Mas então por que o conteúdo não seria entregue na visualização de página inicial?
Estou trabalhando no Google Chrome no macOS. O Firefox não tem problemas em obter os arquivos todas as vezes. O Opera NUNCA obtém os arquivos. O Safari seleciona as imagens após várias atualizações.
Usando curl
eu não tenho problemas:
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==
Alguns sugeriram que eu exclua a distribuição do CloudFront e a recrie. Parece uma correção bastante dura e inconveniente.
O que está causando esse problema?
Atualizar:
Adicionando cabeçalhos de resposta de uma imagem que falhou ao carregar.
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