Установка Access-Control-Allow-Origin на Cloudfront

У меня есть проблемы при обслуживании статических активов Firefox с помощью AWS Cloudfront.

Прекрасные работы Chrome, но Firefox возвращают ошибку CORS.

Если я выполняю завихрение, я добираюсь:

HTTP/1.1 200 OK
Content-Type: application/x-font-opentype
Content-Length: 39420
Connection: keep-alive
Date: Mon, 11 Aug 2014 21:53:50 GMT
Cache-Control: public, max-age=31557600
Expires: Sun, 09 Aug 2015 01:28:02 GMT
Last-Modified: Fri, 08 Aug 2014 19:28:05 GMT
ETag: "9df744bdf9372cf4cff87bb3e2d68fc8"
Accept-Ranges: bytes
Server: AmazonS3
Age: 2743
X-Cache: Hit from cloudfront
Via: 1.1 c445b20dfbf3128d810e975e5d84e2cd.cloudfront.net (CloudFront)
X-Amz-Cf-Id: ...

Тому, которое я думаю, нужен заголовок:

Access-Control-Allow-Origin: *

Кто-либо может помочь мне? Почему это - проблема на Firefox и не Chrome? Как я могу решить его?

15
задан 12 August 2014 в 01:41
3 ответа

Прежде всего, Вам необходимо убедиться, что заголовок исходного белого списка:

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

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html#request-custom-cors

Также смотрите: http://aws.amazon.com/blogs/aws/enhanced-cloudfront-customization/

Кстати, есть несколько похожих вопросов о неисправности сервера/переполнении стека и много ответов на них.

18
ответ дан 2 December 2019 в 20:50

Это немного сложнее, чем показывает принятый ответ.

Поддержка CORS при использовании Cloudfront + S3 фактически реализована в S3, и, согласно Amazon, она работает следующим образом:

Заголовок Origin запроса должен соответствовать элементу AllowedOrigin.

Метод запроса (например, GET или PUT) или заголовок Access-Control Request-Method в случае, если предварительный запрос OPTIONS должен быть одним из элементов AllowedMethod.

Каждый заголовок, указанный в заголовке запроса Access-Control-Request-Headers в предварительном запросе, должен соответствовать элементу AllowedHeader.

Это имеет смысл, но может быть неясно, что если клиент не отправляет заголовок Origin , то эта обработка вообще не выполняется. И мы используем Cloudfront, который,если вы просто размещаете статические ресурсы, вы, вероятно, настроили его так, чтобы игнорировать все заголовки при кешировании. Поэтому, если первый запрос к каждому файлу от определенного пограничного узла не включает заголовок Origin, он кэширует ответ без заголовка Access-Control-Allow-Origin.

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

Есть несколько способов исправить / обойти это.

  • Настроить облачный интерфейс для выполнения условного кэширования на основе заголовка "Origin".

Это отлично работает, если вы ожидайте только нескольких или одного источника, но в противном случае коэффициент кэширования может стать очень плохим.

  • Используйте Lambda @ edge для принудительной установки заголовков, это можно сделать только один раз для каждого запроса источника (S3).

Полностью гибкий, но увеличивает накладные расходы и затраты.

  • Сделайте так, чтобы облачный интерфейс заменял заголовок «Origin» фиктивным значением для каждого запроса.

Это действительно полезно только в случае «Access-Control-Allow-Origin: *» и это немного похоже на взлом, но это, вероятно, лучшее текущее решение при размещении статических ресурсов на облачном фронте + S3.

4
ответ дан 2 December 2019 в 20:50

Сегодня я столкнулся с этой проблемой, когда некоторые файлы шрифтов (*.woff/*woff2) на S3, обслуживаемые через CloudFront, потеряли заголовок ответа Access-Control-Allow-Origin, что привело к ошибкам CORS в веб-браузерах. Я ожидаю, что веб-сканер (или что-то еще) запросил файлы без заголовка запроса Origin, что привело к кэшированной копии шрифтов без необходимого заголовка Access-Control-Allow-Origin.

К счастью, теперь Amazon представила CloudFront Functions, которые, среди прочего, могут изменять заголовки запросов и ответов в качестве более дешевой альтернативы Lambda@edge. У них есть пример функции специально для добавления заголовка Origin, если он отсутствует, здесь:

https://github.com/aws-samples/amazon-cloudfront-functions/tree/main/add-origin-header

Это работает хорошо для меня.

0
ответ дан 19 June 2021 в 14:11

Теги

Похожие вопросы