1. ホーム
  2. http

[解決済み] Cache-Control: max-age=0とno-cacheの違いは何ですか?

2022-03-14 14:50:07

質問

ヘッダー Cache-Control: max-age=0 は、コンテンツが直ちに古いとみなされる (そして再送信されなければならない) ことを意味し、実質的には Cache-Control: no-cache .

解決方法は?

私も同じ疑問を持っていて、検索でいくつかの情報を見つけました(あなたの質問も結果の1つとして出てきました)。 以下は、私が判断したことです。

には2つの側面があります。 Cache-Control ヘッダがあります。 一方は、ウェブサーバ(別名:オリジンサーバ")が送信できる場所です。 もう一方は、ブラウザ(別名:ユーザーエージェント)が送信するものです。


オリジンサーバーから送信する場合

私が思うに max-age=0 は、キャッシュ (およびユーザエージェント) に最初から古いレスポンスであることを伝えるだけで、その結果 すべき を使用して)レスポンスを再検証します。 If-Not-Modified ヘッダ) を使用してからキャッシュされたコピーを使用するのに対し。 no-cache は、彼らに 必須 キャッシュされたコピーを使用する前に再バリデートする。 より 14.9.1 キャッシュ可能なもの :

ノーキャッシュ

...キャッシュは、その応答を使用してはならない。 後続のリクエストに対応するため での再確認が成功しない限り オリジンサーバ これにより オリジンサーバーは に設定されているキャッシュによって クライアントに対して古くなった応答を返す リクエストに対応します。

言い換えれば、キャッシュは時々古い応答を使用することを選択することができる(ただし、その場合、キャッシュに Warning ヘッダを含む)、しかし no-cache は、何があってもstale responseを使うことは許されないと言っています。 もしかしたら、あなたが欲しいのは すべき -revalidate の動作は、野球の統計がページ内で生成されたときに必要ですが、あなたは 必須 -eコマースで購入した際のレスポンスを生成した際に、-revalidateの動作を行います。

というコメントでは正しいのですが。 no-cache は保存を妨げるものではないとされていますが、実はもう一つの違いとして no-cache . あるページに出会いました。 キャッシュ制御ディレクティブの概要 と書かれています(その正しさは保証できませんが)。

<ブロッククオート

実際には、IEとFirefoxは キャッシュなし ディレクティブは、あたかも ブラウザは、ページをキャッシュすることさえしません。 私たちはこの挙動を観察し始めました。 1年ぐらい前に 私たちは この変更のきっかけは を広く(そして正しくなく)使用している。 ディレクティブを使用してキャッシュを防止することができます。

...

最近になって、"cache-control: no-cache"も挙動を開始しました。 ディレクティブのようなものです。

余談ですが、どうやら Cache-Control: max-age=0, must-revalidate と基本的に同じ意味であるべきです。 Cache-Control: no-cache . ということは、もしかしたら、その方法で MUST -のバリデーション動作は no-cache の見かけ上の移行を回避しつつ no-cache と同じことをするために no-store (つまり、キャッシュは一切しない)?


ユーザーエージェントから送信された場合

私が思うに shahkalpeshの回答 は、ユーザーエージェント側に適用されます。 また 13.2.6 複数のレスポンスの曖昧さ回避 .

ユーザーエージェントがリクエストを送る際に Cache-Control: max-age=0 (別名: End-to-end revalidation") の場合、途中の各キャッシュはそのキャッシュエントリを再確認します (例えば、"quot" のように If-Not-Modified ヘッダ)をオリジンサーバに送信します。 その後、304(Not Modified)の応答があれば、キャッシュされたエンティティを使用することができます。

一方、リクエストを送る際に Cache-Control: no-cache (別名. "end-to-end reload")は再バリデートを行わず、サーバーの MUST NOT は、応答時にキャッシュされたコピーを使用します。