7

私はこのヘッダーに混乱がCache-Control:must-revalidateあり、キャッシュされたアイテムを提供する前にソースですべてのリクエストを検証する義務があることを読みましたが、古いものだけですか?またはすべてが古くなっていても新鮮でも関係ありませんか?私は別の場所で両方のことを読みました。

との違いは何Cache-Control:no-cacheですか?これらのヘッダーは私と同じように見えるからです。

更新1:私は本からこれを読みました:

Cache-Control: must-revalidate応答ヘッダーは、鮮度計算メカニズムをバイパスし、すべてのアクセスで再検証するようにキャッシュに指示します

@Peter O.は、RFCの内容を指摘しています。その古い本は間違っています。

更新2:このチュートリアルの内容:http ://www.mnot.net/cache_docs/

no-cache—キャッシュされたコピーを解放する前に、キャッシュが検証のためにオリジンサーバーにリクエストを送信するように強制します。これは、認証が(パブリックと組み合わせて)尊重されることを保証するため、またはキャッシングのすべての利点を犠牲にすることなく、厳格な鮮度を維持するために役立ちます。

must-revalidate—表現について提供する鮮度情報に従わなければならないことをキャッシュに通知します。HTTPを使用すると、キャッシュは特別な条件下で古い表現を提供できます。このヘッダーを指定することで、ルールに厳密に従うようにキャッシュに指示します。

4

1 に答える 1

11

HTTP / 1.1のセクション14.9.4 :

キャッシュによって受信された応答にmust-revalidateディレクティブが存在する場合、そのキャッシュは、 最初にオリジンサーバーで再検証せずに、後続の要求に応答するために古くなった後、エントリを使用してはなりません。

HTTP / 1.1のセクション14.8:

応答に「must-revalidate」cache-controlディレクティブが含まれている場合、キャッシュは後続の要求への応答にその応答を使用できます(MAY)。ただし、応答が古くなっている場合は、すべてのキャッシュで最初にオリジンサーバーで再検証する必要があります...

したがって、受信した場合 must-revalidateは、古い応答のみを再検証する必要があるようです。

についてno-cacheは、セクション14.9.1を参照してください。

no-cacheディレクティブがフィールド名を指定しない場合(ここではそうです)、キャッシュは、オリジンサーバーでの再検証が成功しない限り、応答を使用して後続の要求を満たすことはできません。

したがって、no-cache新鮮な応答と古い応答の両方に適用されます。

編集:

このフレーズはここに関連している可能性があります(セクション13.3):

キャッシュにクライアントの要求への応答として使用したい古いエントリがある場合、最初にオリジンサーバー (または場合によっては新しい応答を持つ中間キャッシュ)に、キャッシュされたエントリがまだ使用可能かどうかを確認する必要があります。

したがって、must-revalidateキャッシュに中間キャッシュがある場合はおそらく関連性があります。そうでない場合、キャッシュはオリジンサーバーを直接チェックするのではなく、中間キャッシュで新しい応答をチェックできるためです。

于 2011-09-27T18:43:33.300 に答える