Могу ли я установить заголовок Access-Control-Allow-Origin для всех страниц в домене и его поддоменах?
Я пытаюсь использовать webfont, который мне законно разрешено использовать, но не распространять. Я размещаю файлы шрифтов в отдельном домене, используемом для статического контента. Эти два домена не связаны друг с другом (один не является поддоменом другого). Допустим, что сайт, использующий webfont, example.com
, а сайт, на котором он размещен, находится example.net
.
Я пробовал это в файле .htaccess на example.net
<FilesMatch "\.(ttf|otf|eot|woff|svg)$">
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "example.com"
</IfModule>
</FilesMatch>
Однако это позволяет шрифту работать только на домашней странице example.com
. Я снова попробовал:
Header set Access-Control-Allow-Origin "example.com/*"
Теперь шрифт работает на example.com
везде, кроме главной страницы, которая (конечно) не то, что я хотел.
Я не могу найти документацию для этого заголовка. Я действительно хочу разрешить все страницы на example.com
и www.example.com
(или, для хорошей меры, *.example.com
). Есть ли простой способ сделать это? Я предполагаю, что заголовок принимает какое-то регулярное выражение.
В поисках документации я нашел,
- много информации о том, как этот заголовок взаимодействует с ajax,
- много коротких заметок, в которых говорится, что это необходимо для веб-сайтов (по крайней мере, в Firefox).
Я не нашел никакой документации о синтаксисе самого заголовка или о том, как указать варианты домена.
На основе ответа на соответствующий вопрос, я пробовал это:
<FilesMatch "\.(ttf|otf|eot|woff|svg)$">
<IfModule mod_headers.c>
SetEnvIf Origin "http(s)?://(www\.)?(example.com)$" AccessControlAllowOrigin=$0$1
Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
Header set Access-Control-Allow-Credentials true
</IfModule>
</FilesMatch>
Я понял, что для каждого запроса будет установлен отдельный заголовок, позволяющий каждой запрашивающей странице индивидуально использовать шрифт. Тем не менее, проверка с помощью Firebug выглядит так: заголовок всегда http://example.com
, как на домашней странице, так и в другом месте. Тем не менее, это работает, но оставляет меня в замешательстве. Связанный вопрос показывает, что аналогичная установка не работала для кого-то еще. Его вопрос предполагает, что для него он фактически отправлял другой заголовок для каждой запрашивающей страницы, и поэтому ответы HTTP 304 Not Modified
были нарушены. Его решение заключалось в том, чтобы добавить директиву always
в .htaccess
, но для меня это привело к ошибкам HTTP 500
.
Как и сейчас, его работа, и я думаю, будет продолжать работать, когда example.com
переключается на HTTPS (как будет скоро). Однако я не могу помочь, но чувствую, что это слишком сложно. Он каждый раз устанавливает один и тот же заголовок, но для этого используется сложное сопоставление шаблонов. Кроме того, пока у меня нет никаких проблем с ответами HTTP 304 Not Modified
(на самом деле, Ive еще не видел таких ответов: браузер просто не запрашивает файлы шрифтов вообще, пока я не очистил кеш), я волнуюсь, что я могу видеть их в будущее.
Ответы
Ответ 1
Как указано спецификацией CORS, вы можете иметь только один домен в заголовке Access-Control-Allow-Origin
(или *
или null
).
Итак, да, вам нужно установить заголовок по-разному в зависимости от того, какой домен запрашивает сайт. Вот почему фрагмент конфигурации apache, который вы указали, пытается сопоставить в заголовке Origin
запроса с этим regex:
http(s)?://(www\.)?(example.com)$
$
соответствует концу строки. Таким образом, это регулярное выражение будет соответствовать запросам от http://www.example.com
, http://example.com
и их эквивалентов https, но не example.com/bla
. Это должно быть хорошо, так как заголовок Origin
запроса, а также заголовок Access-Control-Allow-Origin
ответа должен содержать только хост, а не подстраницы.
Итак, когда вы находитесь на странице http://example.com/about-us
, браузер отправит что-то вроде следующего запроса, чтобы получить шрифт от http://cdn.net/myfont.otf
:
GET /myfont.otf HTTP/1.1
Host: http://cdn.net
Origin: http://example.com
Там сервер будет нарисовать шаблон в заголовке Origin и вернуться с помощью:
Access-Control-Allow-Origin: http://example.com
Ответ 2
Для справки я обновлял файлы /etc/apache 2/conf/sites-enabled/* для этой же цели. Мой код:
<Directory /var/www/dir>
AllowOverride FileInfo Options
Header set Access-Control-Allow-Origin "http://example.com"
Header set Access-Control-Allow-Origin "http://www.example.com"
</Directory>
Одна вещь, с которой мне пришлось иметь дело - у меня не было включено mod_headers, поэтому перезапуск apache не удался. Я должен был включить это с помощью
a2enmods headers