Могу ли я установить заголовок 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