2011-07-14 7 views
9

ご存知の方もいらっしゃるかもしれませんが、Firefox/ChromeにはXmlHttpRequestオブジェクトによって開始されるリクエストのキャッシュに関する問題がいくつかあります。これらの問題は、ブラウザが厳密にルールに従わず、新しいXSLTファイル(たとえば)のためにサーバーに移動しないことを意味します。レスポンスにExpiresヘッダーがありません(パフォーマンス上の理由から、使用できません)。ChromeでXmlHttpRequestのローカルキャッシュをバイパスするようにFirefoxで可能ですか?

Firefoxには、XHRオブジェクトの "channel"に追加のパラメータがあり、これに値Components.interfaces.nsIRequest.LOAD_BYPASS_CACHEを指定すると、明示的にサーバーに移動します。

Chromeのようなものがありますか?

私は即座に誰も停止させてください。 GETパラメータまたはランダムな整数の値としてタイムスタンプを追加することをお勧めします。サーバが別のURL要求を受け取らないようにしたいと思います。元のURLを取得します。理由は、単純な静的ファイルの要求が多すぎてサーバーがクライアントに必要以上のデータを送信しないようにすることです。

生成されたGETパラメータ( '?forcenew = 12314'など)を使用して静的ファイルをヒットした場合、最初に200回の応答が返され、ターゲットの静的ファイルがクライアントのバージョンと同一である場合、常に304を返す要求を出したいと思います。これは、どのようにWebブラウザがすぐに動作するのかはまだまだですが、XHRオブジェクトは、ファイルが変更されたかどうかを尋ねるためにサーバーにまったく移動しない傾向があります。

答えて

2

仕事中の私の主なプロジェクトでは、まったく同じ問題がありました。私の解決策は、ランダムな文字列やタイムスタンプをGET要求に追加するのではなく、という特定の文字列をGETリクエストに追加することでした。

リビジョン番号がある場合など。 Subversionのリビジョン、またはgit/merまたはあなたが使っているものと同じように、それを追加します。静的ファイルは新しいリビジョンがリリースされる瞬間までに304応答を得るでしょう。新しいリリースが発生した場合、単一の200応答が許可され、幸いに304応答を生成することに戻ります。 :-)

これには、ブラウザに依存しないという特典が追加されています。

リビジョン番号がないと不運になる場合は、リビジョン番号を付けないでください。

+1

私は、この賞金の終わりが私たちの解決策にどのように影響を与えたくないので、私たちがそれを解決する方法を入れるのを待っていたかったのです。私たちはあなたが示唆したことを正確に行いました:)現時点では、私たちはGETを生成するWebサイトの "再発行"を、その時点のタイムスタンプと共に実行します。私は実際に他の方法を参照してください... –

+1

タイムスタンプの良いもの - 仕事で私たちはSubversionからgitへの移行について議論しており、私はgitにリビジョン番号がないことを心配しています。多分私たちはタイムスタンプと一緒に行かなければなりません。 :-) – CodeReaper

1

あなたはEtagsを見てください。etagsはファイルの内容から生成することができるキーなので、一度サーバーのファイルが変更されるとシステムは新しいetagになります。明らかに、これはサービス側の変更になります。これは、200以降の304を望む場合に必要なことです。 ChromeとFFはこれらのエタグを尊重する必要がありますので、クライマックスなクライアントサイドのハッキングを行う必要はありません。

+0

私はあなたの考えを理解しています。この時点で既にEtagsをブラウザに送っています。問題は、Firefox/Chromeが、XHRオブジェクト経由でリクエストがルーティングされたときに、このような場合にサーバーにアクセスしないことを決定することです。問題は、これらの場合(ローカルブラウザのキャッシュをバイパスするために)ブラウザをサーバーに移動させる方法です。 –

0

現在、ChromeはCache-Control: max-age=0リクエストHTTPヘッダーをサポートしています。あなたがXMLHttpRequestインスタンスを開いた後、あなたはそれを設定することができます。

xhr.setRequestHeader("Cache-Control", "max-age=0"); 

これは、再検証せずにキャッシュされた応答を使用しないようにChromeを指示します。

詳細については、ノッティンガムのThe State of Browser Caching, RevisitedRFC 7234 Hypertext Transfer Protocol (HTTP/1.1): Cachingのチェックを参照してください。

+1

上記のようなヘッダーを追加するだけで、CORsリクエストを入れて、ちょっとお世話になりました。プリフライトのOPTIONS呼び出しを行います。 –

関連する問題