Запросы между источниками Запросы AJAX к AWS S3 иногда приводят к ошибке CORS

Мне нужно получить некоторые общедоступные файлы с S3.

Это моя конфигурация 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>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

И вот мой JS-код:

const response = await fetch(url, {
    mode: 'cors',
});

const blob = await response.blob();

Это работает, но не всегда. Иногда в консоли появляется следующая ошибка:

Access to XMLHttpRequest at 'https://my-bycketuel/file.jpg' from origin 'https://my.host' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Но после того, как я перезагружаю страницу (иногда несколько раз, иногда только один раз), ошибка исчезает, и я могу прочитать объект ответа.

Вам нужно внести {мой-bycketuel / *} в белый список на {мой.хост}. И таким образом вопрос будет решен для вас навсегда. Это проблема кросс-платформенного доступа. Должно быть легко.

Kunal Vohra 14.03.2019 10:12

Другой рекомендуемый способ — использовать обратный прокси-сервер для решения проблемы.

Kunal Vohra 14.03.2019 10:15
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
2 477
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Кажется, вам не хватает

<AllowedMethod>Head</AllowedMethod>

в вашем конфигурационном файле.

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

Убедитесь, что в разрешенных методах Http вы выбрали Get, Head, Options, а также включите методы Access-Control-Allow-Methods, Access-Control-Allow-Origin и Origin в свой белый список.

Попробуй это!

Удачи

Я добавил <AllowedMethod>HEAD</AllowedMethod>, но проблема не исчезла. Но самое странное для меня то, что иногда это работает, иногда нет, и я не могу найти для этого никакой причины или правила.

wube 14.03.2019 12:35

Вы проверили свой белый список?

Jean Rauwers 14.03.2019 13:03

Какой белый список вы имеете в виду? Я уже нашел, что вызывает проблему. Это как-то связано с кешированием: stackoverflow.com/questions/55158189/…

wube 14.03.2019 14:06
Ответ принят как подходящий

ОП здесь.

Я смотрел на успешные и неудачные запросы в инструментах разработчика Chrome. Я обнаружил, что неудачные запросы имеют код состояния: 200 OK (from disk cache), когда успешные запросы имеют код состояния: 200 OK

Когда я отключаю кеширование с помощью cache: 'no-cache', проблема исчезает.

const response = await fetch(url, {
    method: 'GET',
    mode: 'cors',
    cache: 'no-cache',
    headers: {
        Origin: window.location.origin,
    },
});

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


// Обновлено:

Я обнаружил, что я не одинок: Кэшированный ответ без CORS конфликтует с новым запросом CORS

Это ошибка в реализации CORS S3. S3 не может установить Vary: Origin для ответов на запросы, отличные от CORS, даже если в корзине включен CORS... поэтому Chrome предполагает, что он может повторно использовать кешированный ответ в контексте CORS, но слишком поздно обнаруживает, что он не будет работать. , потому что в кэшированном ответе не хватает Access-Control-Allow-Origin ... serverfault.com/a/856948/153161

Michael - sqlbot 14.03.2019 14:11

Другие вопросы по теме