Рейтинг:1

Проблема AWS Cloudfront CORS с файлами шрифтов

флаг in

У меня есть приложение Javascript, которое доставляется в браузер с конечной точки CloudFront. Все статические файлы приложения размещаются в корзине S3. Это включает в себя целую кучу файлов javascript и css, а также некоторые файлы шрифтов.

HTML-код, загружающий все приложение, генерируется и доставляется сервером, назовем этот сервер «https://my.domain.com».

Как уже упоминалось, это всего лишь файл html. Все затем статический контент загружается из конечной точки облачного интерфейса, которая указывает на корзину в качестве своего источника. Назовем их xxxx.cloudfront.net, а ведро my-bucket.

Насколько я понимаю, почти любой запрос из этого сгенерированного html к конечной точке облачного интерфейса является запросом CORS, поскольку источником html является my.domain.com, и все запрошенные файлы явно не размещены в этом домене.

Поэтому, естественно, я пошел настраивать все материалы CORS. Прежде всего, это ведро является общедоступным и имеет следующую политику CORS:

[
    {
        "Разрешенные заголовки": [
            "*"
        ],
        "Разрешенные методы": [
            "ПОЛУЧАТЬ"
        ],
        "Разрешено происхождение": [
            "*",
        ],
        «Разоблачить заголовки»: [],
        "MaxAgeSeconds": 3000
    }
]

И это, кажется, работает, для всего... кроме файлы шрифтов! Я, вероятно, должен упомянуть структуру папок ведра. Он имеет три папки: производство, разработка и общее. Их содержание должно быть достаточно понятным. Common содержит шрифты, а также некоторые сторонние библиотеки javascript. Производство и разработка содержат js и css для соответствующих сред.

В любом случае, все загружает, кроме файлов шрифтов, для которых я получаю следующую ошибку:

Доступ к шрифту https://xxxx.cloudfront.net/common/fonts/outline/budicon-classic.ttf?jdete2 из источника https://my.domain.com заблокирован политикой CORS: Нет Заголовок Access-Control-Allow-Origin присутствует в запрошенном ресурсе.

Мне показалось крайне странным, что Только файлы шрифтов будут иметь эту проблему. Другие файлы в общей папке загружаются нормально, и если я просто вставлю https://xxxx.cloudfront.net/common/fonts/outline/budicon-classic.ttf?jdete2 в моем браузере, это работает.

Разница только в том, что эти файлы загружаются не из html, а из css через @font-face штучку. Глядя на запросы, сгенерированные браузером при загрузке приложения, я ясно вижу, что, например, установлен заголовок источника, чего не было для запроса файлов js или css. Для Set-Fetch-Mode установлено значение «cors», а для других файлов — «no-cors».

В любом случае, я попытался решить проблему на стороне облачного интерфейса. Во-первых, я добавил заголовок «Access-Control-Allow-Origin: *» в исходную конфигурацию. Затем я добавил конфигурацию поведения для источника, чтобы разрешить GET, HEAD, OPTIONS для шаблона пути *.

И теперь... ну, теперь у меня все та же проблема, и у меня совершенно нет идей, хотя я задаюсь вопросом, почему запрос, созданный @font-face, формируется так по-разному по сравнению с запросами на ресурсы javascript и css, но самое главное, что я могу сделать, чтобы загрузить в них чертовы шрифты?

Рейтинг:0
флаг in

Ладно, это раздражало, но, думаю, логично.

Исправления, которые я написал выше Выполнять работу, но изменения конфигурации не делают облачный кэш недействительным. А поскольку ошибки CORS генерируются браузер, Cloudfront кэшировал этот ответ, заголовки и все остальное, поскольку не видел в нем ничего плохого.

Короче говоря: недействительный облачный кеш после изменения конфигурации, теперь он работает. АРХ!

Ответить или комментировать

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