У меня возникла проблема с CORS при попытке запросить данные файла ActiveStorage из моего интерфейса React, в мой Rails API, используя S3 в качестве поставщика хранилища.
Что я использую:
- Rails в режиме API
- ActiveStorage
- Реакция (используя Ax ios для запросов)
- S3
Загрузка файлов работает нормально, благодаря библиотеке ReactActiveStorageProvider.
Загрузка файлов работает нормально локально, когда я использую диск для хранения, но в «производственных» случаях, когда мы используем S3, всегда происходит сбой с ошибкой CORS Access-Control-Allow-Origin
.
По сути, в моем сериализаторе я включаю URL-адрес файла, используя помощник rails_blob_url
для каждого элемента, а затем, когда пользователь выбирает для загрузки указанный c, клиент делает запрос на этот URL-адрес. для данных файла. Не уверен, что это правильная или даже хорошая реализация, но я мало что могу найти о ActiveStorage в режиме API.
Запрос URL-адреса Rails для данных файла, кажется, работает нормально, возвращает правильные заголовки ответа и т. Д. c. но затем перенаправление на S3 имеет минимальные заголовки запросов и ответов, например, ActiveStorage их не перенаправляет или что-то в этом роде.
Примечание. У меня настроена конфигурация CORS для S3-контейнера, и она, кажется, работает нормально и возвращает правильные заголовки, когда я скручиваю его с опциями
РЕДАКТИРОВАТЬ: Вот моя конфигурация CORS для корзины S3:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>http://subdomain.domain.com*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>HEAD</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
И мой код ответа на запрос Rails ActiveStorage - 302 найдено, поэтому перенаправление и затем второй запрос от перенаправления непосредственно на S3, кажется, даже не имеет кода ответа, как я сказал, что есть минимальные заголовки, нет источника, нет статуса, нет метода запроса.