Я сделал учетную запись, чтобы ответить на ваш вопрос, потому что существует очень мало хороших ответов для этой проблемы (и нескольких связанных).
Проблема, которую вы описываете, по какой-то причине в первую очередь связана с хром, FF и IE, кажется, достаточно умна, чтобы не делиться кешем между AJAX и обычными вызовами в этих случаях.
Проблема
Давайте сначала описать, почему проблема происходит для будущих читателей:
- Browser (Chrome) запрашивает сервер с помощью обычного
<img>
или <script>
тег. Если сервер находится в том же домене, он не включает заголовки CORS.
- Сервер (S3) возвращает ресурс. Если в запросе отсутствует заголовок Origin, он не присоединяет заголовки CORS в ответе, поскольку они являются избыточными.
- Браузер (Chrome) попробуйте снова получить ресурс, используя AJAX, но на этот раз на самом деле не идет сервер, а просматривает кешированный ресурс.
- Браузер (Chrome) В кеш-версии нет заголовков CORS. Он отклонит запрос как нарушение доступа-разрешения-разрешения-происшествия или другие связанные с этим проблемы.
Раствор
В HTML5 есть атрибут называется crossorigin
, который можно добавить в теги, чтобы показать, что они должны передавать информацию происхождения. Возможные значения crossorigin='anonymous'
и crossorigin='use-credentials'
это совершенно не имеет отношения к вопросу спросил, но, как говорится в документации:
По умолчанию (то есть, когда атрибут не указан), CORS не используется вообще.
https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes
Так просто создать свои метки изображения, как этого <img src='cloundfront.path' crossorigin='use-credentials'>
это так. Это довольно неясно, поэтому я надеюсь, что этот ответ сэкономит время исследований для множества людей.
Проблема также была сообщена на [AWS Forums] (https://forums.aws.amazon.com/thread.jspa?messageID=555417) –