法的に使用が許可されているが配布は許可されていないWebフォントを使用しようとしています。静的コンテンツに使用される別のドメインでフォントファイルをホストしています。 2つのドメインは無関係です(一方は他方のサブドメインではありません)。 Webフォントを使用しているサイトがexample.com
であり、それをホストしているサイトがexample.net
であるとします。
example.net
の.htaccessファイルでこれを試しました
<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
)ですべてのページを許可することです。これを行う簡単な方法はありますか?ヘッダーにはある種の正規表現が必要だと思います。
私が見つけたドキュメントを探して、
ヘッダー自体の構文や、ドメインのバリアントを指定する方法に関するドキュメントは見つかりませんでした。
関連する質問への回答 に基づいて、私はこれを試しました:
<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
であるように見えます。それにもかかわらず、これは機能しますが、私は混乱します。関連する質問は、 同様の設定が他の誰かのために機能していなかった であることを示しています。彼の質問は、彼にとって、実際にはwas要求ページごとに異なるヘッダーを送信していたため、HTTP 304 Not Modified
応答が壊れていたことを示唆しています。彼の解決策は、always
ディレクティブを.htaccess
に追加することでしたが、私にとってはHTTP 500
エラーが発生しました。
現在のように機能しており、example.com
がHTTPSに切り替わっても、私はthinkは引き続き機能します(まもなく開始されます)。しかし、私はそれが過度に複雑であると感じずにはいられません。毎回同じヘッダーを設定しますが、複雑なパターンマッチングを使用しています。また、HTTP 304 Not Modified
応答にはまだ問題はありませんが(実際、そのような応答はまだ見ていません。ブラウザは、キャッシュをクリアするまでフォントファイルをまったく要求しません)、将来会うのではないかと心配です。
CORS仕様 で述べられているように、Access-Control-Allow-Origin
ヘッダー(または*
またはnull
)にはドメインを1つだけ含めることができます。
そうです、どのドメインがサイトを要求しているかに応じて、ヘッダーを異なる方法で設定する必要があります。これが、投稿した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
参考までに、同じ目的で/ etc/Apache2/conf/sites-enabled/*ファイルを更新していました。私のコード:
<Directory/var/www/dir> AllowOverride FileInfo Options ヘッダーセットAccess-Control-Allow-Origin "http://example.com" ヘッダーセットAccess-Control-Allow-Origin "http://www.example.com" </ Directory>
私が対処しなければならなかったことの1つ-私はmod_headersを有効にしていなかったので、Apacheの再起動は失敗しました。私はそれを可能にしなければなりませんでした
a2enmodsヘッダー