У меня есть проблемы при обслуживании статических активов 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? Как я могу решить его?
Прежде всего, Вам необходимо убедиться, что заголовок исходного белого списка:
Если Вы хотите, чтобы CloudFront уважал настройки совместного использования ресурсов, настройте CloudFront на переадресацию заголовка Origin к Вашему источнику.
Также смотрите: http://aws.amazon.com/blogs/aws/enhanced-cloudfront-customization/
Кстати, есть несколько похожих вопросов о неисправности сервера/переполнении стека и много ответов на них.
Это немного сложнее, чем показывает принятый ответ.
Поддержка 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.
В результате первый входящий запрос будет определять какие заголовки возвращаются для всех запросов, пока не истечет срок действия кеша.
Есть несколько способов исправить / обойти это.
Это отлично работает, если вы ожидайте только нескольких или одного источника, но в противном случае коэффициент кэширования может стать очень плохим.
Полностью гибкий, но увеличивает накладные расходы и затраты.
Это действительно полезно только в случае «Access-Control-Allow-Origin: *» и это немного похоже на взлом, но это, вероятно, лучшее текущее решение при размещении статических ресурсов на облачном фронте + S3.
Сегодня я столкнулся с этой проблемой, когда некоторые файлы шрифтов (*.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
Это работает хорошо для меня.