У мене є веб-сторінка ( https://smartystreets.com/contact ), яка використовує jQuery для завантаження деяких SVG-файлів із S3 через CloudFront CDN.
У Chrome я відкрию вікно інкогніто, а також консоль. Тоді я завантажу сторінку. Коли сторінка завантажується, я зазвичай отримую від 6 до 8 повідомлень у консолі, схожих на це:
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.
Якщо я роблю стандартне перезавантаження сторінки, навіть багаторазове, я продовжую отримувати однакові помилки. Якщо я це зробити, Command+Shift+R
то більшість, а іноді й усі, зображення завантажуватимуться без XMLHttpRequest
помилок.
Іноді навіть після завантаження зображень я оновитимусь, і одне або більше зображень не завантажуватимуться та повертатимуть цю XMLHttpRequest
помилку знову.
Я перевірив, змінив і повторно перевірив налаштування на S3 та Cloudfront. У S3 моя конфігурація CORS виглядає так:
<?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>
(Примітка: спочатку була лише <AllowedOrigin>*</AllowedOrigin>
та сама проблема.)
У CloudFront поведінку розподілу встановлюється , щоб дозволити методи HTTP: GET, HEAD, OPTIONS
. Методи кешування однакові. Заголовки вперед встановлені на "Білий список", а цей білий список містить "Контроль доступу-запит-заголовки, метод доступу-контроль-запит, походження".
Той факт, що він працює після завантаження браузера без кешу, схоже, свідчить про те, що на стороні S3 / CloudFront все добре, інакше, чому вміст буде доставлений. Але тоді чому вміст не буде розміщено на початковому перегляді сторінки?
Я працюю в Google Chrome на macOS. Firefox не має проблем із отриманням файлів кожного разу. Опера НІКОЛИ не отримує файли. Safari зніме зображення після декількох оновлень.
З використанням у curl
мене проблем не виникає:
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==
Деякі запропонували мені видалити дистрибутив CloudFront і відтворити його. Здається, це досить суворе та незручне виправлення.
Що викликає цю проблему?
Оновлення:
Додавання заголовків відповідей із зображення, яке не вдалося завантажити.
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