9

サーバーがコードベースの更新をプッシュした後に、Webページのクライアントにキャッシュ(つまり、画像、JavaScriptなど)を強制的に再ロードする方法はありますか?なぜ特定の機能がもはや機能しないのかを尋ねる多くのヘルプデスクコールがあります。新しく更新されたjavascriptファイルをダウンロードする際に、簡単なハードリフレッシュによって問題が修正されます。サイトの更新後にブラウザがすべてのキャッシュを再ロードするようにする

詳細については、Glassfish 3.xを使用しています。およびJSF 2.1.xこれは、もちろんJSF以外のものにも当てはまります。私が望んでいる行動記述するために

が可能です:

サイトAは、2枚の画像と2つのJavaScriptファイルがあります。ユーザーがサイトにアクセスし、4つのファイルがキャッシュされます。限り、私は懸念している限り、ユーザーが特に "ハード"リフレッシュまたはキャッシュをクリアしない限り、ファイルを "再ダウンロード"する必要はありません。サイトがファイルの1つへの更新をプッシュすると、サーバは、クライアントに前記更新を通知する何らかの種類のメタデータをヘッダに持たせることができる。クライアントが選択すると、新しいファイルがダウンロードされます。

私がしたくないのは、メタタグをページのヘッダーに入れて、何もキャッシュされないようにすることです。ただ、クライアントに更新が発生したことを通知するものが必要です。最新のものが更新されたら最新のものです。私はこれがちょうどクライアント側のバージョン管理のいくつかの並べ替えであると思います。

ありがとうございました!

私はこのような状況のためにキャッシュなしのパラメータを使用し

答えて

12

これを処理する正しい方法は、リソースのURL規約を変更することです。たとえば、私たちのようにそれを持っています。ブラウザは、まだファイルをキャッシュしますが、それをバージョン管理との適切な方法を実行するために取得するには

/resources/js/fileName.js 

、URLに何かを追加することです。クエリ文字列に値を追加するとキャッシングができないので、配置する場所は/resources/です。

キャッシュをクエリ文字列のための参照:http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.9

したがって、たとえば、あなたのURLは次のようになります。

/resources/1234/js/fileName.js 

だから何あなたができることは、プロジェクトのバージョン番号(またはプロパティでいくつかの値を使用しています/ configファイル)には、この番号に変更する必要があるため、プロジェクトが変更されたときにのみ変更されるため、キャッシュファイルの再ロード時に手動で変更します。したがって、あなたのURLは次のようになります:

/resources/cacheholder${project.version}/js/fileName.js 

これで十分です。

中間の値が動的なので、問題はURLをマッピングすることです。私たちが克服したのは、URL書き換えモジュールであり、アプリケーションに到達する前にURLをフィルタリングすることができました。書き換えは、次のようなURLを見ました:

/resources/cacheholder______/whatever 

そして、cacheholder_______/部分を削除しました。書き直し後、通常のリクエストのように見え、サーバーは他の特定のマッピング/ロジックなしで正しいファイルで応答します...ポイントは、ブラウザが新しいファイルだと思ったことです(本当に ' t)、それを要求し、サーバーはそれを把握し、正しいファイルを提供します(「奇妙な」URLでも)。

もちろん、この動的文字列をファイル名自体に追加してから、書き換えツールを使用して削除することもできます。いずれにしても、同じことが行われます。書き換え中に文字列を対象とし、それを削除します。これは、サーバーブラウザをだますことができますが、ない:)


UPDATE:

私が本当に好きな代替は、内容に基づいてファイル名を設定し、それをキャッシュすることです。例えば、これはハッシュで行うことができます。もちろん、このタイプのものは手動で行い、プロジェクトに保存するものではありません(うまくいけば)。これはアプリケーション/フレームワークが処理すべきものです。

  • すべてのリソースが
  • (このファイルまたはマッピング)新しいファイルをチェックされていると、作成されます。たとえば、Grailsの中で、「ハッシュとキャッシュ」リソース、次のことが起こるようにというプラグインがありますあなたのページへ<script>/<link>タグを追加する場合はハッシュという名前のファイルが要求されると、ハッシュ化された名前は
  • その内容
  • のハッシュに使用され、それが元のリソース
  • ハッシュ・を提供しています名前名前付きファイルが "永遠に"キャッシュされる

この設定の素晴らしい点は、正しくキャッシュすることを心配する必要がないことです。ファイルを永久にキャッシュするように設定するだけです。ハッシュはコンテンツに基づいて利用可能なファイル/マッピングを処理する必要があります。また、ロールバック/取り消しがすでにキャッシュされ、すばやく読み込まれるようにする機能も備えています。

+0

"クエリ文字列に値を追加するとキャッシュが許可されません" - 私が読んだドキュメントから、そのステートメントは不正確です。 HTTP GETはブラウザによってキャッシュされ、問合せ文字列の有無は問わない。 http://www.w3schools.com/tags/ref_httpmethods.asp – pmont

+0

@ pmontを参照してください.W3Schoolsを実際のW3ドキュメントで参照しないでください。あなたのポイントは無効です、私が投稿したリンクを読むか、より正当なものを提供してください – Ian

+0

それについて私に怒る必要はありません。私が配備したWebサーバーには、すべてのキャッシュされたクエリURLがあります。どのサーバーがキャッシュしていないことを確認しましたか?あなたのリンクから:これは具体的には、そのようなURIのHTTP/1.0サーバからの応答をキャッシュから取得してはならないことを意味します "" HTTP/1.1の変更によって異なる動作が説明される可能性がありますか? – pmont

0

... (設定ファイルから)

$no_cache = "v11"; 

とページに、私は

<img src="a.jpg?nc=$no_cache"> 
のような資産を使用するように、文字列定数値を持っているが

と私のコードを更新するときに、ちょうど$ no_cacheの値を変更し、それは魅力のように動作します。

+0

しかし、あなたが指摘したように、これではリソースがキャッシュされることはありません。なぜこれが欲しいですか? – Ian

+0

no_cache値を変更しないと、静的ファイルがキャッシュされます。静的なものを変更した場合にのみ変更してください。 – tanaydin

+0

いいえ、それは当てはまりません。クエリーストリングを持つものは、HTTP仕様に従ってキャッシュされるべきではありません。一部のブラウザではこれに従うものもあれば、そうでないものもあります。したがって、最後にクエリーストリングがあるので、ブラウザは常にリクエストを行います。サーバーはキャッシュされている可能性がありますが、それでもクライアントにはキャッシュされません。 – Ian

関連する問題