FirefoxとCDNでホストされているフォントへのアクセスに関する非常に厄介な問題の解決策をどうにかして見つけたと思いましたが、ここにIE9があります。
私は最近、IE9のキャッシュの問題で非常に苛立たしい問題を見つけ、このブログ投稿(IE9 Redirect Caching Nightmare)に偶然出くわし、実際の問題についてより多くのことを教えてくれました。
上記が実際に問題であるかどうかはわかりませんが、十分に近いようです。
問題:
同じサーバーを指す2つのドメイン(ベースドメインとサブドメイン)でセットアップされたWebサイトがあり、Cloudfrontによって提供されるAmazonS3でホストされているCDNからの同じリソースセットを使用しているまったく同じWebサイトを提供しています。
https://example.com
https://www.example.com
@ font-faceを使用してCSSファイルからフォントをロードすると、IE9開発ツールコンソールにこの種のエラーメッセージが表示されます。
CSS3117: @font-face failed cross-origin request. Resource access is restricted.
これは、最初にいずれかのURLをロードし、次にもう一方のURLにアクセスしたときに発生します。IE9はで実行されていませんCompatibility Mode
。実行中Document Mode: IE9 Standards
です。
CORSについての私の限られた理解と、Access-Control-Allow-Origin
HTTPヘッダーを設定する必要性から、S3 CORSポリシーで忠実に設定しました。これは、Firefoxで完全に機能します。
両方のドメインからのリクエストは、CDNリソースをリクエストするときにそれぞれのヘッダーを取得します。
IE9はキャッシュを使用して最適化を試み、リダイレクトもキャッシュしたようです。Access-Control-Allow-Origin
ヘッダーもキャッシュされるため、これにより問題が発生します。CDNサーバーにリクエストを送信しないと、Access-Control-Allow-Origin
ドメインごとにヘッダーを変更できません。
そのため、リクエストがからhttps://www.example.com
であるにもかかわらず、Access-Control-Allow-Origin
がであるという状況が残りhttps://example.com
ます。これにより、上記のエラーメッセージでリソース制限の問題が発生します。
詳細: Firefox 19でチェックしたところ、上記の状況が実際に発生しましたが、IE9と同じような厳格な制限はありません。https://www.example.com
情報を要求するサブドメイン( )access-control-allow-origin
は、メインドメイン(https://example.com
)のを受け入れます。Chrome(Webkit)は気にしないようです。どのブラウザの動作の実装が正しいか迷っています。
CDNの現在の設定では、ChromeとFirefoxが、すべてのwww
サブドメインリクエストをメインドメインに自動的に再ルーティングしているようです。アドレスバーにサブドメインを何度も入力しようとすると、www
ChromeとFirefoxはそれに従います。一方、IE9は、アドレスバーに入力されたアドレスに移動します。IE9はここでは奇妙なもののようですが、どのブラウザの動作が実際に正しいかはわかりません。
使いやすさの観点から、ChromeとFirefoxは「正しい」動作のようです。
既知の可能な解決策:
Access-Control-Allow-Origin
すべてを許可するようにヘッダーを設定します。*
- ブラウザでキャッシュをオフにする
- 1つのドメインを別のドメインにリダイレクトする
- クエリ文字列を使用して、リソースに対するさまざまなドメイン呼び出しを区別します
- フォントをdata-uriとしてCSSに埋め込みます
解決策1の場合、許可する特定のドメインを設定したいだけだと言ってみましょう。
ソリューション2の場合、すべてのブラウザーに設定する場合は最適ではありません。また、サイトは通常、望ましいダウンロード速度よりも遅いモバイルデバイスで実行する必要があります。
解決策3については可能ですが、IE9のキャッシュの問題に直接対処する解決策に興味があります。
ソリューション4の場合、特にリソースがから呼び出される場合、実装は非常に困難です@font-face
。問題を回避するためにフォントをロードするためだけに、異なる行の異なるドメイン呼び出しに対してCSSを動的に再生成する必要があるということですか?CSS自体の目的を打ち破り、そのためのリソースをキャッシュしているようです。
編集:スタイルシートは機能しますが、フォントの読み込みは機能しません。
ソリューション5の場合、特にフォントファイルが定期的に変更される場合は、メンテナンスと更新が面倒です。
質問:この特定のケースでIE9のリダイレクトキャッシュ動作を具体的に処理する既知の方法はありますか?
回答とコメントは大歓迎です。前もって感謝します!
編集:より多くのブラウザテスト情報。