Как я могу исправить проблему с веб-шрифтом "Отсутствует заголовок ответа общего доступа к ресурсам (CORS)"?

Почему-то шрифты перестали отображаться на моих сайтах. Шрифты хранятся локально, на том же сервере, что и сайт.

Я посмотрел на проблему, и это, кажется, Missing Cross-Origin Resource Sharing (CORS) Response Header но я не могу понять решение для этого.

Все различные сайты говорят, чтобы использовать: Access-Control-Allow-Origin:*

Но так как я в первую очередь фронтенд, я не знаю, где его поставить. Может ли это помочь моему хозяину?

Что я могу сделать, чтобы решить проблему?

РЕДАКТИРОВАТЬ:

рассматриваемый сайт: http://cyclistinsuranceaustralia.com.au/

Например, номер телефона в правом верхнем углу должен быть шрифтом Bebas, но по умолчанию это Impact.

В консоли я получаю ошибки:

Шрифт из источника " http://www.cyclistinsuranceaustralia.com.au/" заблокирован для загрузки политикой совместного использования ресурсов перекрестного происхождения: заголовок "Access-Control-Allow-Origin" имеет значение " http://www.cyclistinsuranceaustralia.com.au/', который не равен предоставленному источнику. Поэтому происхождение ' http://cyclistinsuranceaustralia.com.au/' не разрешено.

Я связываюсь с моим хозяином, который сказал поставить:

Access-Control-Allow-Origin "http://www.cyclistinsuranceaustralia.com.au"

в моем файле.htaccess, но это не изменилось.

6 ответов

Решение

В вашем HTML вы установили "базовый" тег:

<base href="http://www.cyclistinsuranceaustralia.com.au/">
  1. Удалите эту строку из своего HTML, если она вам не нужна. Это должно заставить работать шрифты при просмотре с http://cyclistinsuranceaustralia.com.au/.
  2. Вы, вероятно, должны будете перенаправить http://www.cyclistinsuranceaustralia.com.au/ на http://cyclistinsuranceaustralia.com.au/

Если вы просто заинтересованы в использовании Access-Control-Allow-Origin:*

Вы можете сделать это с этим .htaccess файл в корне сайта.

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

Некоторая полезная информация здесь: http://enable-cors.org/server_apache.html

Я собираюсь предположить, что ваш хост использует C-Panel - и это, вероятно, HostGator или GoDaddy. В обоих случаях они используют C-Panel (на самом деле это делают многие хосты), чтобы максимально упростить администрирование Сервера для вас, конечного пользователя. Даже если вы проводите хостинг через кого-то другого - посмотрите, можете ли вы войти в какую-то административную панель и найти файл .htaccess, который вы можете редактировать. (Примечание: предшествующий период означает, что это "скрытый" файл / каталог).

Как только вы найдете файл htaccess, добавьте следующую строку:

  1. Header set Access-Control-Allow-Origin "*" Просто чтобы посмотреть, работает ли это.Предупреждение: не используйте эту строку на производственном сервере

Он должен работать. Если нет, позвоните своему хосту и спросите его, почему линия не работает - они, вероятно, смогут быстро помочь вам оттуда.

  1. Как только у вас есть вышеупомянутая рабочая, измените * на адрес запрашивающего домена http://cyclistinsuranceaustralia.com.au/, Вы можете столкнуться с проблемой канонической адресации (включая www), и в этом случае вам может потребоваться настроить хост для перенаправления. Это другой и меньший мост, чтобы пересечь все же. Вы по крайней мере будете в правильном месте.

В вашем конкретном случае проблема, по-видимому, связана с доступом к сайту по неканонической ссылке (www.site.com против site.com).

Вместо исправления проблемы с CORS (которая может потребовать записи прокси на серверные шрифты с соответствующими заголовками CORS в зависимости от поставщика услуг), вы можете нормализовать свои URL-адреса, чтобы всегда серверное содержимое содержало канонический URL-адрес, и просто перенаправлять, если требуется страница без "www.

В качестве альтернативы вы можете загрузить шрифты на другой сервер /CDN, для которого известно, что настроены заголовки CORS, или вы можете легко это сделать.

У нас была именно эта проблема с fontawesome-webfont.woff2, который выдавал ошибку 406 на общем хосте (Cpanel). Я работал над неуловимым "доменом без cookie" для проекта Wordpress Multisite, и мои страницы "www.domain.tld" имели бы следующую ошибку (3 раза) в Chrome:

Шрифт из источника ' http://static.domain.tld/ ' заблокирован для загрузки политикой общего доступа к ресурсам разных источников: в запрашиваемом ресурсе отсутствует заголовок "Access-Control-Allow-Origin". Поэтому происхождение ' http://www.domain.tld/ ' не разрешено.

а в Firefox чуть подробнее:

загружаемый шрифт: загрузка не удалась (семейство шрифтов: "FontAwesome" стиль: нормальный вес: нормальное растяжение: нормальный индекс src:1): неверный URI или межсайтовый доступ запрещен источник: http://static.domain.tld/wp-content/themes/some-theme-here/fonts/fontawesome-webfont.woff2?v=4.7.0
font-awesome.min.css: 4: 14 Блокирован перекрестный запрос : одна и та же политика происхождения запрещает чтение удаленного ресурса по адресу http://static.domain.tld/wp-content/themes/some-theme-here/fonts/fontawesome-webfont.woff?v=4.7.0. (Причина: отсутствует заголовок CORS "Access-Control-Allow-Origin").

Я добрался до QWANT-INGING (QWANT.com = фантастический) и нашел этот пост:

Подстановочные поддомены Access-Control-Allow-Origin, порты и протоколы

Час в чате с разными сотрудниками службы поддержки Shared Host (кто-то даже не знал о F12 в браузере...), а затем ожидание ответа на билет, который был урезан после не радости во время игры с mod_security. Тем временем я попытался собрать воедино код для файла.htaccess из этого поста и заставил его безошибочно исправить ошибки 406:

    <IfModule mod_headers.c>
    <IfModule mod_rewrite.c>
        SetEnvIf Origin "http(s)?://(.+\.)?domain\.tld(:\d{1,5})?$" CORS=$0
        Header set Access-Control-Allow-Origin "%{CORS}e" env=CORS
        Header merge  Vary "Origin"
    </IfModule>
    </IfModule>

Я добавил это в начало моего.htaccess в корне сайта, и теперь у меня появился новый дядя по имени Боб. (*** конечно, замените части domain.tld на те, с которыми вы работаете...)

Моя любимая часть этого поста - это возможность RegEx ИЛИ (|) нескольких сайтов в этот "хак" CORS, выполняя:

Чтобы разрешить несколько сайтов:

SetEnvIf Origin "http(s)?://(.+\.)?(othersite\.com|mywebsite\.com)(:\d{1,5})?$" CORS=$0

Это исправление, по правде говоря, поразило меня, потому что я сталкивался с этой проблемой раньше, работая с Dev в компаниях из списка Fortune 500, которые находятся в миле от моей базы знаний Apache и не могли решить подобные проблемы, не заставляя ИТ-специалистов настраивать параметры Apache.

Это своего рода волшебная палочка, чтобы исправить все эти проблемы CDN с доменами без файлов cookie (или почти без файлов cookie, если вы используете CloudFlare...), чтобы уменьшить количество ненужного веб-трафика от файлов cookie, отправляемых только с каждым запросом изображения. быть отброшенным сервером как плохое свидание вслепую.

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

Эти 3 блестящие умы объединяют усилия для решения того, что раньше считалось неразрешимым с помощью.htaccess, из которого я собрал этот код:

@Noyo Noyo

@DaveRandom DaveRandom

@ pratap-koritala Pratap Koritala

У нас была похожая проблема с заголовками в Amazon (AWS) S3, предопределенная ошибка Post в некоторых браузерах.

смысл был сказать ведру CORS выставить заголовок <ExposeHeader>Access-Control-Allow-Origin</ExposeHeader>

подробнее в этом ответе: /questions/39780520/razreshit-ajax-get-iz-amazon-s3-access-control-allow-origin/39780537#39780537

Другие вопросы по тегам