Я получаю следующую ошибку при попытке загрузить изображение с URL-адреса CloudFront в Safari 8: Cross-origin image load denied by Cross-Origin Resource Sharing policy.
Это происходит только в Safari 8. В FireFox 38 и Chrome 41 последнее загружается просто отлично. (Mac 10.10)
Моя настройка:
1. S3 со следующей конфигурацией CORS
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
2. Связанный дистрибутив CloudFront
Следующие заголовки были отмечены белыми (под поведением):
-
Access-Control-Request-Headers
-
Access-Control-Request-Method
-
Origin
3. JavaScript
var img = new Image();
img.crossOrigin = '';
img.onload = function() {
console.log('image loaded');
}
Что я пробовал:
1. Проверка возвращенных заголовков от завитка
Изображение возвращает правильные заголовки (особенно Access-Control-Allow-Origin
)
> curl -sI -H 'Origin: localhost' -H 'Access-Control-Request-Method: GET' http://foo.cloudfront.com/image.jpg
...
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET
Access-Control-Max-Age: 3000
Server: AmazonS3
Vary: Origin,Access-Control-Request-Headers,Access-Control-Request-Method
X-Cache: Hit from cloudfront
2. Проверка возвращенных заголовков в браузере
Интересно, что изображение НЕ возвращает заголовок Access-Control-Allow-Origin: *
во всех трех браузерах. Почему это так?
3. Добавление строки запроса в URL
Добавление строки запроса (например,? foo) к загружаемому URL-адресу приведет к возврату заголовка Access-Control-Allow-Origin
в браузере и позволяет загружать изображение в Safari! Это здорово, но почему добавление строки запроса позволяет этому работать (а также возвращать заголовок Access-Control-Allow-Origin
)?
4. Загрузка изображения из ведра S3 (не привязанного к распределению CloudFront)
Загрузка изображения из другого ведра, не привязанного к CloudFront (с идентичной конфигурацией CORS), также отлично работает в Safari.
Что изначально заставило меня поверить, что это была проблема CloudFront, но вышеупомянутая точка с строкой запроса заставляет меня думать иначе.
Это сводит меня с ума. Может ли кто-нибудь помочь пролить некоторый свет на выше?
Update
Спасибо за ответы. Довольно сложно, я не могу повторить эту проблему.
Ниже приведен фрагмент, который загружает два изображения (одно из ведра S3, другое из его соответствующего распределения Cloudfront), и оба они также кажутся загруженными в точности с заголовками, которые вы ожидаете, вопреки тому, что я сказал выше в точка № 2.
К сожалению, я не очень-то ближе к определенному ответу, но на данный момент я просто собираюсь записать его до ошибки от моего имени, потенциально запрашивая изображение перед установкой CORS, как предложил Дерек.
var img, imgCloudfront;
img = new Image();
img.crossOrigin = '';
img.onload = function() {
$('body').append('image loaded<br>');
}
img.src = 'http://sandbox-robinpyon.s3.amazonaws.com/test.jpg';
imgCloudfront = new Image();
imgCloudfront.crossOrigin = '';
imgCloudfront.onload = function() {
$('body').append('image (cloudfront) loaded<br>');
}
imgCloudfront.src = 'http://d32d4njimxij7s.cloudfront.net/test.jpg';
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>