Правильная конфигурация SOS + Cloudfront CORS?

Мое приложение хранит изображения на S3, а затем проксирует их через Cloudfront. Я рад использовать новую поддержку SOS CORS, чтобы использовать методы canvasа HTML5 (которые имеют политику перекрестного происхождения), но не могут правильно настроить мои S3 и Cloudfront. При попытке конвертировать изображение в элемент canvasа все равно выполняется «Ошибка нечиста: SECURITY_ERR: DOM Exception 18».

Вот что я до сих пор:

S3

  MY_WEBSITE_URL GET 3000 *   MY_CLOUDFRONT_URL GET *   

CloudFront

происхождения

 Origin Protocol Policy: Match Viewer HTTP Port: 80 HTTPS Port: 443 

поведения

 Origin: MY_WEBSITE_URL Object Caching: Use Origin Cache Headers Forward Cookies: None Forward Query Strings: Yes 

Здесь что-то не хватает?

UPDATE: просто попробовал изменить заголовки на

 Content-* Host 

основанный на этом вопросе Amazon S3 CORS (совместное использование ресурсов Cross-Origin) и загрузка кросс-домена Firefox

Все еще нет.

ОБНОВЛЕНИЕ: БОЛЬШЕ ИНФОРМАЦИИ ПО ЗАПРОСУ

 Request URL:https://d1r5nr1emc2xy5.cloudfront.net/uploaded/BAhbBlsHOgZmSSImMjAxMi8wOS8xMC8xOC81NC80Mi85NC9ncmFzczMuanBnBjoGRVQ/32c0cee8 Request Method:GET Status Code:200 OK (from cache) 

ОБНОВИТЬ

Я думаю, может быть, моя просьба была неправильной, поэтому я попытался включить CORS с

 img.crossOrigin = ''; 

но тогда изображение не загружается, и я получаю сообщение об ошибке: загрузка изображения с использованием кросс-оригинала, запрещенная политикой совместного использования ресурсов Cross-Origin.

26 июня 2014 года AWS выпустила правильное поведение Vary: Origin на CloudFront, так что теперь вы просто

  1. Задайте конфигурацию CORS для вашего ведра S3, включая

    *

  2. В CloudFront -> Distribution -> Behaviors для этого источника используйте опцию Forward Headers: Whitelist и белый список заголовка Origin.

  3. Подождите ~ 20 минут, в то время как CloudFront распространяет новое правило

Теперь ваш дистрибутив CloudFront должен кэшировать разные ответы (с соответствующими заголовками CORS) для разных заголовков Origin клиента.

UPDATE: это уже не так с недавними изменениями в CloudFront. Yippee! См. Другие ответы для деталей. Я оставляю это здесь для контекста / истории.

проблема

CloudFront не поддерживает CORS 100%. Проблема в том, как CloudFront кэширует ответ на запрос. Любой другой запрос для того же URL-адреса после этого приведет к кэшированному запросу независимо от источника . Ключевой частью этого является то, что он включает заголовки ответов из источника.

Первый запрос до того, как CloudFront имеет что-либо кэшированное из Origin: http://example.com имеет заголовок ответа:

 Access-Control-Allow-Origin: http://example.com 

Второй запрос от Origin: https://example.com (обратите внимание, что это HTTPS, а не HTTP) также имеет заголовок ответа:

 Access-Control-Allow-Origin: http://example.com 

Потому что именно CloudFront кэшируется для URL. Это неверно – консоль браузера (по крайней мере, в Chrome) покажет сообщение о нарушении CORS, и все сломается.

Временное решение

Предлагаемая работа заключается в использовании разных URL-адресов для разных источников. Хитрость заключается в том, чтобы добавить уникальную строку запроса, которая отличается от другой, так что есть одна кэшированная запись для каждого источника.

Таким образом, наши URL-адреса будут примерно такими:

 http://.../some.png?http_mysite.com https://.../some.png?https_mysite.com 

Такие работы, но каждый может заставить ваш сайт работать плохо, заменяя querystrings. Это возможно? Вероятно, не отладка этой проблемы – это огромная проблема.

Правильное обходное решение – не использовать CloudFront с CORS, пока они не будут полностью поддерживать CORS.

На практике

Если вы используете CloudFront для CORS, обратитесь к другому методу, который будет работать, когда CORS этого не сделает. Это не всегда вариант, но сейчас я динамически загружаю шрифты с помощью JavaScript. Если запрос CORS для CloudFront завершился неудачно, я возвращаюсь к серверному прокси к шрифтам (а не к перекрестному происхождению). Таким образом, все работает, даже несмотря на то, что CloudFront каким-то образом получил плохую кэшированную запись для шрифта.

Не совсем уверен в вашей проблеме:

https://forums.aws.amazon.com/thread.jspa?messageID=377513

ответил на некоторые из моих проблем с CORS, S3 и Cloudfront.

Я также обнаружил, что некоторые активы в ведре возвращаются с правильными заголовками CORS, а некоторые – нет. После недействительности активов все они вернулись с правильными заголовками, не уверены, почему некоторые из них нуждаются в недействительности, а другие – нет, поскольку они были загружены в одно и то же время, в том же типе же ведро 🙁

  • Существует ли политика S3 для ограничения доступа только для просмотра / доступа к одному ведру?
  • Безопасность схем аутентификации REST
  • Загружаемый шрифт на firefox: неправильный URI или межсайтовый доступ не разрешен
  • Amazon S3 boto - как создать папку?
  • Amazon S3 - HTTPS / SSL - Возможно ли это?
  • Как импортировать образ диска VMDK в экземпляр AW2 EC2 t2.micro в область us-east-1e, используя ведро S3 на us-east-1?
  • Amazon S3 CORS (совместное использование ресурсов для разных источников) и загрузка междоменных шрифтов Firefox
  • Каков алгоритм вычисления Amazon-S3 Etag для файла размером более 5 ГБ?
  • Хозяева зоны Amazon AWS не работают
  • Как хранить данные на S3 и безопасный доступ пользователей к клиенту API / iOS с rails?
  • Как настроить проект Django с django-хранилищами и Amazon S3, но с различными папками для статических файлов и медиафайлов?
  • Давайте будем гением компьютера.