no-cacheとmust-revalidateの違い


179

RFC 2616から

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/

キャッシュなし

このディレクティブはブラウザにページをキャッシュしないように指示しているように聞こえますが、微妙な違いがあります。RFCによると、「no-cache」ディレクティブは、キャッシュからページを提供する前にサーバーで再検証する必要があることをブラウザーに通知します。再検証は、アプリケーションが帯域幅を節約できるようにする優れた手法です。ブラウザがキャッシュしたページが変更されていない場合、サーバーはそれをブラウザに通知するだけで、ページはキャッシュから表示されます。したがって、ブラウザは(理論的には)キャッシュにページを保存しますが、サーバーで再検証した後でのみページを表示します。実際には、IEとFirefoxはno-cacheディレクティブを、ページをキャッシュしないようにブラウザーに指示するかのように扱い始めました。私たちはこの行動を約1年前から観察し始めました。

誰かがこれについてもっと公式なものを持っていますか?

更新

再検証が必要なディレクティブは、表現に対する要求の検証に失敗すると、黙って実行されない金融トランザクションなどの不正な操作が発生する可能性がある場合にのみ、サーバーで使用する必要があります。

それは今まで心に留めたことのないことです。RFCはmust-revalidateを軽く使用しないように言っています。問題は、Webサービスでは否定的な見方をして、未知のクライアントアプリにとって最悪の状態を想定する必要があることです。古いリソースは問題を引き起こす可能性があります。

そして、Last-ModifiedやETagsがないと、私が今検討した他の何かは、ブラウザがリソース全体を再びフェッチすることしかできません。ただし、ETagを使用すると、少なくともすべてのリクエストでChromeが再検証されるようです。これにより、リクエストに他のヘッダーが含まれていて、常に「常に再検証」が行われない限り、これらのディレクティブは正しく再検証できないため、これらのディレクティブはどちらも無効であるか、少なくとも名前が不適切です。

最後のポイントをもっと明確にしたいだけです。must-revalidateETagもLast-Modifiedも設定せずに含めるだけで、エージェントは、比較するためにサーバーに送信するものがないため、コンテンツを再度取得することしかできません。

ただし、私の経験的テストでは、ETagまたは変更されたヘッダーデータが応答に含まれている場合、must-revalidateヘッダーの存在に関係なく、エージェントは常に再検証を行うことが示されています。

したがって、ポイントはmust-revalidate、古くなったときに「バイパスキャッシュ」を強制することです。これは、ライフタイム/エージを設定した場合にのみ発生するため、must-revalidateエージまたは他のヘッダーのない応答に設定されている場合、実質的には次のようにno-cacheなります。応答はすぐに古くなったと見なされます。

-では、最後にギリの答えにマークを付けます!


したがって、理論的には違いはvalidate-alwaysvalidate-if-staleですが、実際にはno-cacheは特定のブラウザによって、引用したコメントがnever-validateと表示されるときに扱わ​​れるため、使用するものを選択する必要があります。実際に実現したいキャッシング動作に基づいて…
CBroe

greenbytes.de/tech/webdav/… を読んで 、これがあなたにとって明確であるかどうかを確認してください。
Julian Reschke 2013


回答のため、この決定木をチェックstackoverflow.com/a/49925190/3748498
pravdomil

回答:


191

私はそれがmust-revalidate意味することを信じています:

キャッシュの有効期限が切れると、古い応答が受け入れられるとユーザーが言っても、ユーザーに古い応答を返すことを拒否します。

no-cache意味するのは:

must-revalidate さらに、応答がすぐに古くなるという事実。

応答が10秒間キャッシュ可能である場合、10秒後にmust-revalidate起動しますno-cacheが、must-revalidate、0秒後にします。

少なくとも、それは私の解釈です。


2
それが今私が見ている方法です。興味深い部分は私の最後のパラです。ETagまたはLast-Modifiedがない場合、エージェントはキャッシュ内の内容を検証するために使用するものがないため、ペイロード全体を再度ダウンロードする必要があります。したがって、RFCが「再検証」と言っている場合は、おそらく再フェッチすることを意味します。
ルークPuplett 2013年

44
これも意味max-age=0, must-revalidateno-cache、同じです
Anshul 2015

5
@Anshul、最初は「max-age = 0、must-revalidate、no-cacheは同一である」とあなたは正しいと思っていましたが、それが正しくないように思われるJeffrey Foxの回答を参照してください。
Don Hatch

2
@Anshulいいえ、新しい応答に対して異なる意味がmust-revalidateありno-cacheます:キャッシュされた応答が新しい場合(つまり、応答の有効期限が切れていない場合)はmust-revalidate、サーバーで再検証せずにプロキシがすぐに応答するようにしますがno-cache、プロキシでは再検証する必要があります鮮度に関係なくキャッシュされた応答。出典:「HTTP-The Definitive Guide」、182〜183ページ。
Matthias Braun

8
@MatthiasBraunああ、私は混乱の原因を見ることができます。私が書いたはずでno-cacheありmax-age=0, must-revalidate、同一である
かもしれ

24

max-age=0, must-revalidateそして、no-cache全く同じではありません。でmust-revalidate、サーバーが再検証リクエストに応答しない場合、ブラウザ/プロキシは504エラーを返すはずです。を使用no-cacheすると、キャッシュされたコンテンツのみが表示されます。これは、おそらくユーザーに好まれます(何もないよりも古くなっている方がよい)。これがmust-revalidate重要なトランザクションのみを対象とする理由です。


10
あなたのno-cache解釈がわからない。RFC 7234 から「no-cache」応答ディレクティブは、オリジンサーバーでの検証が成功せずに、後続の要求を満たすために応答を使用してはならないことを示します。これにより、元のサーバーは、古くなった応答を送信するように構成されたキャッシュによってさえ、キャッシュがそれを使用せずに、要求に応じることなく要求に応じることを防ぐことができます。 これはmust-revalidate
Anshul 2016

9
ジェフリーは、実装が彼が説明した方法で動作するという証拠を持っていますか?
OrangeDog

私はこの答えはプロキシ/ lbサーバーに対して正しいと思います。しかし、実際には、ブラウザはその場合504を返しません。
YannDìnendal2017年

つまりmust-validatemust-refresh
Simon_Weaver

15

ジェフリー・フォックスの解釈ではno-cache、私は、クロム52.0.2743.116メートル下の結果が示すテストしてみたno-cacheのと同じ動作を持っているmust-revalidate彼らはすべてのだろう、NOTサーバが到達不能であるときに、ローカルキャッシュを使用し、そして、彼らはすべてのタップブラウザの[戻るながら、キャッシュを使用します。 /サーバーに到達できない場合の/進むボタン。上記のように、少なくとも実装でmax-age=0, must-revalidateは、と同じだと思いますno-cache


サーバーが再検証できる場合、Chromeはローカルキャッシュを使用しますか?(つまり、「If-Modified-Since」)。両方の場合において?
リッチ

-2

私は違いがあると思いmax-age=0, must-revalidateとはno-cache

must-revalidate返された場合、クライアントはIf-Modified-Sinceリクエストを送信し、キャッシュからの応答を提供することが許可されています304 Not Modified

このno-cache場合、クライアントは応答をキャッシュしてはならないため、を使用しないでくださいIf-Modified-Since


6
しかし、no-cache意味するものではありませんno-store-とno-cache、リソースがまだクライアントにキャッシュすることができます。使用する前に再検証する必要がありますか?
アロン

4
あなたは混乱しているno-cacheno-storeno-cacheリソースを再検証する必要があることを意味します。再検証には、If-None-Matchおよびなどの条件付きリクエストを使用するオプションが含まれていますIf-Modified-Since
ジュールサム。ランドルフ

1
@JulesRandolph:あなたは正しいかもしれません。テスト/デモはありますか?このqに関する矛盾する証拠のない主張はすべて苛立たしいものです。受け入れられた答えでさえ、「少なくとも、それは私の解釈です」とだけ言っています。時間があれば、テストベッドを設置してここに投稿するかもしれません。
リッチ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.