質問に答えるために、ここにはクライアント(要求)とサーバー(応答)の2つのプレーヤーがあります。
クライアント:
クライアントは、1つのキャッシュ方式でのみ要求できます。さまざまな方法があり、指定されていない場合はを使用しますdefault
。
- デフォルト:ブラウザのキャッシュを検査します:
- キャッシュされて「フレッシュ」の場合:キャッシュから戻ります。
- キャッシュされている場合、古くなっているが「有効」:キャッシュから戻り、キャッシュを更新するためのフェッチをスケジュールします(次回の使用のため)。
- キャッシュされて古くなっている場合:条件付きでフェッチし、キャッシュして、戻ります。
- キャッシュされていない場合:フェッチ、キャッシュ、および戻ります。
- no-store:フェッチして返します。
- リロード:フェッチ、キャッシュ、および戻ります。(デフォルト-4)
- no-cache:ブラウザのキャッシュを検査します:
- キャッシュされている場合:条件付きでフェッチし、キャッシュして、戻ります。(デフォルト-3)
- キャッシュされていない場合:フェッチ、キャッシュ、および戻ります。(デフォルト-4)
- force-cache:ブラウザのキャッシュを検査します:
- キャッシュされている場合:古くなっているかどうかに関係なく返します。
- キャッシュしない場合:フェッチ、キャッシュ、および戻ります。(デフォルト-4)
- only-if-cached:ブラウザのキャッシュを検査します:
- キャッシュされている場合:古くなっているかどうかに関係なく返します。
- キャッシュされていない場合:ネットワークエラーをスローします。
ノート:
- それでも「有効」とは、電流が寿命
age
内にあることを意味します。stale-while-revalidate
「再検証」が必要ですが、それでも返品できます。
- ここでの「フェッチ」は、簡単にするために「無条件ネットワークフェッチ」の略です。
- 「条件付きでフェッチ」とは
、サーバーが。で応答できるよう
If-Modified-Since
に、などのヘッダーを使用してフェッチすることを意味します。ETag
304: (Not Modified)
https://fetch.spec.whatwg.org/#concept-request-cache-mode
サーバー::
クライアントが何ができるかを理解したので、サーバーの応答はより理にかなっています。Cache-Control
ヘッダーを見て、サーバーが次を返す場合:
- no-store:キャッシュをまったく使用しないようにクライアントに指示します
- no-cache:条件付きリクエストを実行し、鮮度を無視するようにクライアントに指示します
- max-age:キャッシュが「フレッシュ」である時間をクライアントに通知します
- stale-while-revalidate:キャッシュが「有効」である期間をクライアントに通知します
- 不変:永久にキャッシュ
これで、すべてをまとめることができます。つまり、唯一の可能性は次のとおりです。
- 無条件のネットワークフェッチ
- 条件付きネットワークフェッチ
- 古いキャッシュを返す
- 古いが有効なキャッシュを返す
- 新しいキャッシュを返す
- キャッシュを返す
クライアントまたはサーバーの任意の組み合わせで、使用するメソッドまたはメソッドのセットを指定できます。サーバーが戻っno-store
てきた場合、クライアントの要求タイプに関係なく、サーバーはキャッシュにヒットしません。クライアントリクエストがだった場合no-store
、サーバーが何を返すかは関係なく、キャッシュされません。クライアントがリクエストタイプを指定しない場合、サーバーはそれをで指示しCache-Control
ます。
no-cache
サーバーが両方を返すことは意味がなく、すべてをオーバーライドするno-store
ためです。はい、おそらく両方を一緒に見たことがあるでしょう、そしてそれは壊れたブラウザの実装以外では役に立たないです。それでも、1999年から仕様の一部になっています:https ://datatracker.ietf.org/doc/html/rfc2616#section-14.9.2no-store
no-store
実際の使用法では、サーバーがをサポートしていて304: Not Modified
、速度を向上させる方法としてクライアントキャッシュを使用したいが、それでもネットワークフェッチを強制したい場合は、を使用しますno-cache
。をサポートしておらず304
、ネットワークフェッチを強制する場合は、を使用しますno-store
。キャッシュに問題がない場合は、鮮度と再検証のヘッダーを使用してください。
実際には、クライアントを混同しno-cache
てno-store
いる場合、ほとんど変化しません。次に、いくつかのヘッダーが送信され、ブラウザーによって処理されるさまざまな内部応答があります。no-cache
使用した後、使用し忘れると問題が発生する可能性があります。no-cache
応答をキャッシュに保存するように指示し、それなしで後の要求が内部キャッシュをトリガーする可能性があります。
コンテキストに基づいて、同じリソース上でもメソッドを混在させたい場合があります。たとえばreload
、Service Workerとバックグラウンド同期で使用したいdefault
が、Webページ自体には使用したい場合があります。ここで、ユーザーエージェント(ブラウザー)のキャッシュを好みに合わせて操作できます。通常、キャッシュがどのように機能するかについては、サーバーが最終決定権を持っていることを覚えておいてください。
将来起こりうる混乱を明らかにするため。クライアントはリクエストのCache-Control
ヘッダーを使用して、応答時に独自のキャッシュシステムを使用しないようにサーバーに指示できます。これは、ブラウザ/サーバーダイナミックとは関係なく、サーバー/データベースダイナミックとは関係ありません。
また、no-store
技術的には、不揮発性ストレージ(ディスク)に保存して、揮発性ストレージ(メモリ)からできるだけ早く解放してはならないことを意味します。実際には、キャッシュをまったく使用しないことを意味します。コマンドは実際には双方向に実行されます。を使用したクライアント要求はno-store
、ディスクまたはデータベースに書き込むべきではなく、一時的なものです。
TL; DR:no-store
オーバーライドしますno-cache
。サポートされていない仕様外またはHTTP/1.0ブラウザーno-store
(多分IE11?)を話しているのでない限り、両方を設定することは無意味です。サポートに使用no-cache
し304
ます。