web-dev-qa-db-ja.com

ドメインとそのサブドメインのすべてのページにAccess-Control-Allow-Originヘッダーを設定できますか?

法的に使用が許可されているが配布は許可されていない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.comwww.example.com(または、適切には*.example.com)ですべてのページを許可することです。これを行う簡単な方法はありますか?ヘッダーにはある種の正規表現が必要だと思います。

私が見つけたドキュメントを探して、

  • このヘッダーがajaxとどのように相互作用するかについての多くのこと、
  • webフォント(少なくとも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であるように見えます。それにもかかわらず、これは機能しますが、私は混乱します。関連する質問は、 同様の設定が他の誰かのために機能していなかった であることを示しています。彼の質問は、彼にとって、実際にはwas要求ページごとに異なるヘッダーを送信していたため、HTTP 304 Not Modified応答が壊れていたことを示唆しています。彼の解決策は、alwaysディレクティブを.htaccessに追加することでしたが、私にとってはHTTP 500エラーが発生しました。

現在のように機能しており、example.comがHTTPSに切り替わっても、私はthinkは引き続き機能します(まもなく開始されます)。しかし、私はそれが過度に複雑であると感じずにはいられません。毎回同じヘッダーを設定しますが、複雑なパターンマッチングを使用しています。また、HTTP 304 Not Modified応答にはまだ問題はありませんが(実際、そのような応答はまだ見ていません。ブラウザは、キャッシュをクリアするまでフォントファイルをまったく要求しません)、将来会うのではないかと心配です。

11
TRiG

CORS仕様 で述べられているように、Access-Control-Allow-Originヘッダー(または*またはnull)にはドメインを1つだけ含めることができます。

そうです、どのドメインがサイトを要求しているかに応じて、ヘッダーを異なる方法で設定する必要があります。これが、投稿したApache構成スニペットがリクエストのOriginヘッダーでこれと一致しようとする理由です regex

http(s)?://(www\.)?(example.com)$

$は文字列の終わりに一致します。したがって、この正規表現は、http://www.example.comhttp://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
4
mb21

参考までに、同じ目的で/ 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ヘッダー
0
Venky Rao