Шрифт от источника был заблокирован от загрузки по политике совместного использования ресурсов Cross-Origin

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

Шрифт от источника 'https://ABCDEFG.cloudfront.net' был заблокирован от загрузки по политике совместного использования ресурсов Cross-Origin: заголовок "Access-Control-Allow-Origin" отсутствует присутствовать на запрошенном ресурсе. Origin 'https://sub.domain.com', следовательно, не допускается.

У меня есть следующая конфигурация CORS на S3

<CORSConfiguration>
 <CORSRule>
   <AllowedOrigin>*</AllowedOrigin>
   <AllowedHeader>*</AllowedHeader>
   <AllowedMethod>GET</AllowedMethod>
 </CORSRule>
</CORSConfiguration>

Запрос

Remote Address:1.2.3.4:443
Request URL:https://abcdefg.cloudfront.net/folder/path/icons-f10eba064933db447695cf85b06f7df3.woff
Request Method:GET
Status Code:200 OK
Request Headers
Accept:*/*
Accept-Encoding:gzip,deflate
Accept-Language:en-US,en;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Host:abcdefg.cloudfront.net
Origin:https://sub.domain.com
Pragma:no-cache
Referer:https://abcdefg.cloudfront.net/folder/path/icons-e283e9c896b17f5fb5717f7c9f6b05eb.css
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.94 Safari/537.36

Все остальные запросы от Cloudfront/S3 работают правильно, включая JS файлы.

Ответ 1

Добавьте это правило в свой .htaccess

Header add Access-Control-Allow-Origin "*" 

еще лучше, как было предложено @david thomas, вы можете использовать определенное значение домена, например.

Header add Access-Control-Allow-Origin "your-domain.com"

Ответ 2

Chrome с ~ Sep/Oct 2014 заставляет шрифты подвергаться тем же проверкам CORS, что Firefox сделал https://code.google.com/p/chromium/issues/detail?id=286681. Об этом говорится в https://groups.google.com/a/chromium.org/forum/?fromgroups=#!topic/blink-dev/TT9D5-Zfnzw

Учитывая, что для шрифтов браузер может выполнить предполетную проверку, тогда ваша политика S3 также нуждается в заголовке запроса cors. Вы можете проверить свою страницу в Safari (который в настоящее время не выполняет проверку CORS для шрифтов), а Firefox (что делает), чтобы дважды проверить, что это проблема.

См. ответ на Amazon S3 CORS (совместное использование ресурсов Cross-Origin) и загрузку шрифтов между доменами Firefox для деталей Amazon S3 CORS.

NB вообще, потому что это применяется только для Firefox, поэтому это может помочь найти Firefox, а не Chrome.

Ответ 4

Мне удалось решить проблему, просто добавив <AllowedMethod>HEAD</AllowedMethod> в политику CORS для ведра S3.

Пример:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>

Ответ 5

26 июня 2014 года AWS выпустила правильное поведение Vary: Origin на CloudFront, так что теперь вы просто

Задайте конфигурацию CORS для вашего ведра S3:

<AllowedOrigin>*</AllowedOrigin>

В CloudFront → Distribution → Behaviors для этого источника используйте опцию Forward Headers: Whitelist и белый список заголовка Origin.

Подождите ~ 20 минут, в то время как CloudFront распространяет новое правило

Теперь ваш дистрибутив CloudFront должен кэшировать разные ответы (с соответствующими заголовками CORS) для разных заголовков заголовков клиента.

Ответ 6

Единственное, что сработало для меня (возможно, потому, что у меня были несоответствия с использованием www.):

Вставьте это в свой файл .htaccess:

<IfModule mod_headers.c>
<FilesMatch "\.(eot|font.css|otf|ttc|ttf|woff)$">
    Header set Access-Control-Allow-Origin "*"
</FilesMatch>
</IfModule>
<IfModule mod_mime.c>
# Web fonts
AddType application/font-woff woff
AddType application/vnd.ms-fontobject eot

# Browsers usually ignore the font MIME types and sniff the content,
# however, Chrome shows a warning if other MIME types are used for the
# following fonts.
AddType application/x-font-ttf ttc ttf
AddType font/opentype otf

# Make SVGZ fonts work on iPad:
# https://twitter.com/FontSquirrel/status/14855840545
AddType     image/svg+xml svg svgz
AddEncoding gzip svgz

</IfModule>

# rewrite www.example.com → example.com

<IfModule mod_rewrite.c>
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]
</IfModule>

http://ce3wiki.theturninggate.net/doku.php?id=cross-domain_issues_broken_web_fonts

Ответ 7

У меня была эта же проблема, и эта ссылка предоставила мне решение:

http://www.holovaty.com/writing/cors-ie-cloudfront/

Короткий вариант:

  • Изменить конфигурацию S3 CORS (мой пример кода не отображается правильно)
    Примечание: это уже сделано в исходном вопросе
    Примечание: предоставленный код не очень безопасен, больше информации на связанной странице.
  • Перейдите на вкладку "Поведение" вашего дистрибутива и нажмите, чтобы изменить
  • Измените "Forward Headers" на "None (Улучшает кеширование)" на "Белый список".
  • Добавить "Origin" в список "Список белых списков"
  • Сохранить изменения

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

Ответ 8

Существует хорошая запись здесь.

Конфигурирование этого в nginx/apache является ошибкой.
Если вы используете хостинговую компанию, вы не можете настроить ее.
Если вы используете Docker, приложение должно быть автономным.

Обратите внимание, что в некоторых примерах используется connectHandlers, но это только устанавливает заголовки в документе. Использование rawConnectHandlers применяется ко всем предоставленным активам (шрифты/css/etc).

  // HSTS only the document - don't function over http.  
  // Make sure you want this as it won't go away for 30 days.
  WebApp.connectHandlers.use(function(req, res, next) {
    res.setHeader('Strict-Transport-Security', 'max-age=2592000; includeSubDomains'); // 2592000s / 30 days
    next();
  });

  // CORS all assets served (fonts/etc)
  WebApp.rawConnectHandlers.use(function(req, res, next) {
    res.setHeader('Access-Control-Allow-Origin', '*');
    return next();
  });

Это было бы подходящее время, чтобы посмотреть политику браузера, например, кадрирование и т.д.

Ответ 9

Для тех, кто использует продукты Microsoft с файлом web.config:

Объедините это с вашим web.config.

Чтобы разрешить на любом домене заменить value="domain" на value="*"

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.webserver>
    <httpprotocol>
      <customheaders>
        <add name="Access-Control-Allow-Origin" value="domain" />
      </customheaders>
    </httpprotocol>
  </system.webserver>
</configuration>

Если у вас нет разрешения на редактирование web.config, добавьте эту строку в свой серверный код.

Response.AppendHeader("Access-Control-Allow-Origin", "domain");