[解決済み】no-cacheとmust-revalidateの違いについて
質問
RFC2616より
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1
ノーキャッシュ
no-cache ディレクティブがフィールド名を指定しない場合、キャッシュは のない限り、後続のリクエストを満たすためにその応答を使ってはならない(MUST NOT)。 オリジンサーバでの再確認が成功した場合。これにより、オリジン するように設定されているキャッシュでも、キャッシュされないようにすることができます。 は、クライアントのリクエストに対して古くなった応答を返します。
そのため、エージェントに再バリデーションを指示します。 すべて のレスポンスになります。
これと比較すると
マスト・リバリデート
受信したレスポンスに must-revalidate ディレクティブが存在する場合 キャッシュは、そのエントリーが古くなった後、そのエントリーを使用してはならない(MUST NOT)。 で再検証することなく、後続のリクエストに応答しています。 オリジンサーバー
そのため、エージェントに再認証を指示します。 古い のレスポンスになります。
特に
no-cache
ユーザーエージェントがこのディレクティブを実際に、経験的にどのように扱っているか?
のポイントは何でしょうか?
no-cache
があれば
must-revalidate
と
max-age
?
こちらのコメントをご覧ください。
http://palpapers.plynt.com/issues/2008Jul/cache-control-attributes/
ノーキャッシュ
このディレクティブは、ブラウザに対して、以下のことを指示するように聞こえます。 をキャッシュしていますが、微妙な違いがあります。no-cache" ディレクティブは RFCによると、ブラウザに「再検証を行うべき」と伝えています。 キャッシュからページを提供する前に、サーバーの 再認証は アプリケーションが帯域を節約するための巧妙なテクニックです。もし ブラウザがキャッシュしているページが変更されていない場合、サーバーは単に をブラウザに伝え、キャッシュからページを表示する。したがって ブラウザは(少なくとも理論的には)、ページをキャッシュに保存しますが サーバーと再認識した後に表示されます。実際には、IE とFirefoxは、no-cacheディレクティブをあたかも ページをキャッシュしないように指示する。私たちは この挙動は、1年ほど前から見られるようになりました。私たちは、この変化が このディレクティブが広く(そして正しくなく)使用されていることが原因です。 キャッシュを行わないようにする。
この件に関して何か公式な情報をお持ちの方はいらっしゃいますか?
更新情報
must-revalidate ディレクティブは、表現上のリクエストの検証に失敗した場合、 例えば黙って実行されない金融取引のような不正な操作につながる場合にのみ、 サーバーが使用すべきものです。
それは今まで心に留めていなかったことです。RFCは、must-revalidateを軽々しく使うなと言っているのです。Webサービスでは、未知のクライアントアプリに対して否定的な見方をし、最悪の事態を想定しなければならないということです。古くなったリソースは問題を引き起こす可能性があるのです。
それと、今考えたのですが、Last-ModifiedやETagsがないと、ブラウザはリソース全体を再度取得するしかありません。しかし、ETagsを使用すると、少なくともChromeはリクエストごとに再検証を行うようです。というのも、リクエストに他のヘッダが含まれていて、それが「常に再検証」を引き起こすのでなければ、適切に再検証することができないからです。
最後のポイントをはっきりさせたいんです。単に
must-revalidate
を含むが、ETag や Last-Modified を含まない場合、エージェントはコンテンツを再取得するだけで、比較するためにサーバに送信するものがないため、再取得できない。
しかし、私の経験的なテストによると、ETag や modified ヘッダデータがレスポンスに含まれる場合、エージェントは常に再バリデーションを行います。
must-revalidate
ヘッダがあります。
ということで、ポイントは
must-revalidate
は、キャッシュが古くなったときに強制的に「バイパスキャッシュ」を行うもので、これはライフタイム/年齢を設定したときにのみ発生するため、もし
must-revalidate
が年齢や他のヘッダのないレスポンスに設定されると、実質的に
no-cache
というのも、このレスポンスは即座に古いと判断されるからです。
-- というわけで、ついにギリさんの回答に印をつけることにします!(笑)。
解決方法は?
私は、次のように考えています。
must-revalidate
という意味です。
キャッシュが失効したら、古い応答をユーザーに返すことを拒否する。 が、たとえ「古いレスポンスは許容できる」と言われても。
ここで
no-cache
を意味する。
must-revalidate
それに、すぐにレスポンスが古くなることも。
レスポンスが10秒間キャッシュ可能であれば
must-revalidate
は10秒後にキックされるのに対し
no-cache
を意味します。
must-revalidate
を0秒後に実行します。
少なくとも、私の解釈ではそうです。
関連
-
[解決済み] URI、URL、URNの違いは何ですか?
-
[解決済み] updateとdeleteのHTTPステータスコード?
-
[解決済み] POSTとPUT HTTP REQUESTの違いは何ですか?
-
[解決済み] Cache-Control: max-age=0とno-cacheの違いは何ですか?
-
[解決済み] Chromeのネットワークデバッガをリダイレクトで使用する方法
-
[解決済み】HTTPのPOSTとPUTの違いは何ですか?
-
[解決済み】REST APIでのPUTメソッドとPATCHメソッドの使い分け 実生活でのシナリオ
-
[解決済み] bash/shellスクリプトからhttp応答コードを評価する方法は?
-
[解決済み】http:// のリンクを全て // に変更することは可能ですか?
-
[解決済み] PragmaヘッダーとCache-Controlヘッダーの違い?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] IISファイルのダウンロードがハングアップ/タイムアウトする - sc-win32-status = 64
-
[解決済み] HTTPポストで文字+が%2Bに変換される
-
[解決済み] Cache-Control: max-age=0とno-cacheの違いは何ですか?
-
[解決済み] ブラウザの「F5」や「Ctrl + F5」によるリフレッシュはどのようなリクエストを発生させるのでしょうか?
-
[解決済み] なぜCSRF防止トークンをクッキーに入れるのが一般的なのですか?
-
[解決済み】REST APIでPATCHとPUTのどちらを使うべきですか?
-
[解決済み】HTTPヘッダ(キャッシュコントロール用)を設定する方法は?)
-
[解決済み】URLのアンパサンドのエスケープについて
-
[解決済み】ユーザーエージェント文字列の大きさはどれくらいになりますか?
-
[解決済み】HTTPの "Content-Type "ヘッダーのすべての可能な値は何ですか?