ブラウザのキャッシュでキーとして使用されるのはファイル名ですか、それとも URL 全体ですか?

StackOverflow https://stackoverflow.com/questions/83990

質問

ブラウザーに JavaScript、CSS、画像などのリソースをキャッシュさせたいのが一般的です。新しいバージョンが利用可能になるまで、ブラウザーが代わりに新しいバージョンをフェッチしてキャッシュするようにします。

解決策の 1 つは、リソースのファイル名にバージョン番号を埋め込むことですが、この方法で管理するリソースを、リビジョン番号が含まれるディレクトリに配置しても同じことになりますか?ファイルへの URL 全体がブラウザのキャッシュ内のキーとして使用されますか、それともファイル名自体と何らかのメタデータだけでしょうか?

コードがフェッチから変更された場合 /r20/example.js/r21/example.js, 、リビジョン 20 であると確信できますか? example.js はキャッシュされていましたが、代わりにリビジョン 21 がフェッチされ、現在はキャッシュされています。

役に立ちましたか?

解決

はい、変更があれば どの部分でも URL (HTTP および HTTPS プロトコルの変更を除く) はブラウザ (および中間プロキシ) によって別のリソースとして解釈されるため、ブラウザ キャッシュ内に別個のエンティティが作成されます。

アップデート:

での主張 このThinkVitaminの記事 Opera および Safari/Webkit ブラウザは ?query=strings を使用した URL をキャッシュしません。 間違い.

URL にバージョン番号パラメータを追加することは、キャッシュ無効化を実行する完全に許容される方法です。

ThinkVitamin 記事の著者を混乱させたのは、Safari と Opera のアドレス/場所バーで Enter キーを押すと、クエリ文字列を含む URL の動作が異なるという事実です。

しかし、 (そしてここが重要な部分です!) オペラとサファリ IE や Firefox と同じように動作します Webページの埋め込み/リンクされた画像とスタイルシートとスクリプトをキャッシュすることになると - 「?」を持っているかどうかに関係なく - URLの文字。(これは、通常の Apache サーバーでの簡単なテストで検証できます。)

(もし私にそれをするという評判があったなら、私は現在受け入れられている答えについてコメントしたでしょう。:-)

他のヒント

ブラウザのキャッシュ キーは、リクエスト メソッドとリソース URI の組み合わせです。URI はスキーム、権限、パス、クエリ、フラグメントで構成されます。

関連する抜粋 HTTP 1.1仕様:

プライマリ キャッシュ キーは、リクエスト メソッドとターゲット URI で構成されます。ただし、HTTPキャッシュは今日、一般的に使用されているため、通常はキャッシュ応答に限定されているため、多くのキャッシュは単に他の方法を拒否し、URIのみをプライマリキャッシュキーとして使用しています。

関連する抜粋 URIの指定:

一般的なURI構文は、スキーム、権限、パス、クエリ、およびフラグメントと呼ばれるコンポーネントの階層シーケンスで構成されています。

URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]

hier-part   = "//" authority path-abempty
              / path-absolute
              / path-rootless
              / path-empty

ブラウザーでリソースをキャッシュするために使用されるのは URL 全体であると 99.99999% 確信しています。そのため、URL スキームは問題なく機能するはずです。

HTTP オブジェクトを識別するために最低限必要なのは、クエリ文字列パラメータを含むフルパスです。ブラウザによっては、クエリ文字列を含むオブジェクトをキャッシュしない場合がありますが、それはキャッシュのキーとは関係ありません。

パスだけでは不十分であることを覚えておくことも重要です。ヴァリ:HTTP 応答のヘッダーは、ブラウザ (またはプロキシ サーバーなど) に、キャッシュ キーを決定するために使用される URL 以外のもの (Cookie、エンコード値など) を警告します。

基本的な質問に対して、はい、.js ファイルの URL を変更するだけで十分です。何がキャッシュ キーを決定するかというより大きな問題は、URL と Vary です。ヘッダーの制限。

はい。キャッシュの観点からは、異なるパスも同じです。

もちろん、パス全体「/r20/example.js」と「/r21/example.js」を使用する必要があり、そもそも完全に異なるイメージである可能性があります。あなたが提案したのは、バージョン管理を処理する実行可能な方法です。

ほとんどのブラウザでは、完全な URL が使用されます。一部のブラウザでは、URL にクエリが含まれている場合、ドキュメントはキャッシュされません。

URL全体。いくつかの古いブラウザで、大文字と小文字の区別が影響する奇妙な動作を確認しました。

既存の回答に加えて、ServiceWorkers やオフラインプラグインなどを使用する場合には適用されない可能性があることを追加したいと思います。その場合、ServiceWorker の設定方法に応じて、異なるキャッシュ ルールが発生する可能性があります。

によります。完全な URL であるはずですが、一部のブラウザ (Opera、Safari)2) 異なるパラメータを持つ URL に対して異なるキャッシュ戦略を適用します。

最善の策はファイル名を変更することです.

ここには非常に賢い解決策があります(PHP、Apacheを使用)

http://verens.com/archives/2008/04/09/javascript-cache-problem-solved/

戦略メモ:「HTTP キャッシュ仕様の規定によれば、ユーザー エージェントはクエリ文字列を含む URL を決してキャッシュすべきではありません。Internet Explorer と Firefox はこれを無視しますが、Opera と Safari は無視しません。すべてのユーザー エージェントがリソースをキャッシュできるようにするには、URL にクエリ文字列を含めないようにする必要があります。」

http://www.thinkvitamin.com/features/webapps/serving-javascript-fast

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top