12

HTTPヘッダーを使用して条件付きリクエストを実装するには、2つの異なる方法があるようです。どちらもキャッシング、範囲リクエスト、同時実行制御などに使用できます...:

  1. クライアントがリソースのタイムスタンプを送信するIf-Unmodified-Since および If-Modified-Since 。
  2. If-Modified および If-None-Modified 。クラ​​イアントはリソースのETag表現を送信します。

どちらの場合も、クライアントはリソースに関する情報を送信します。これにより、クライアントがリソースを最後に参照してからリソースが変更されたかどうかをサーバーが判断できるようになります。次に、サーバーは、クライアントから提供された条件付きヘッダーに応じて、要求を実行するかどうかを決定します。

なぜ2つの別々のアプローチが利用できるのかわかりません。確かに、サーバーはタイムスタンプから ETag を生成することを非常に簡単に選択できるため、ETag はタイムスタンプに取って代わります。

だから、私の質問は次のとおりです。

  • ETag よりも If-Unmodified-Since/If-Modified-Since を好むシナリオはどれですか?
  • どのシナリオで両方が必要になる可能性がありますか?
4

3 に答える 3

14

私はかつて同じことを考えましたが、非常に重要な違いが1つあることに気付きました。日付は注文できますが、ETagは注文できません。

これは、あるリソースが1年前に変更されたが、それ以降は変更されていない場合、それを知っていることを意味します。そうすれば、昨年の任意の日付に対するIf-Unmodified-Sinceリクエストに正しく答えることができ、確かに...その日付以降変更されていないことに同意できます。

Etagはアイデンティティについてのみ比較可能です。同じかそうでないかのどちらかです。上記と同じリソースがあり、その年の間にdocrootが新しいディスクとファイルシステムに移動され、すべてのファイルに新しいiノードが与えられますが、変更日は保持されます。そして、誰かがファイルのiノード番号に基づいてETagを作成していました。そうすると、過去のまだ大丈夫なETagのログがなければ、古いETagがまだ大丈夫だとは言えません。

ですから、私はそれらを一方が他方を時代遅れにしているとは見ていません。それらはさまざまな状況に対応しています。提供しようとしているページ内のすべてのデータの最終変更日を簡単に取得するか、提供するデータのETagを簡単に取得できます。

多くのdbルックアップからのデータを含む動的なWebページがある場合、データベースに多くの変更日を含めることなく、最終変更日が何であるかを判断するのは難しい場合があります。ただし、レンダリングされた結果ページのmd5チェックサムをいつでも作成できます。

これらのキャッシュプロトコルをサポートするとき、私は間違いなくそれらの1つだけを選び、両方を使うことはありません。

于 2010-01-24T12:47:28.477 に答える
3

かなり大きな違いが 1 つあります。過去にサーバーに ETag を要求したことがある場合にのみ、ETag を使用できます。タイムスタンプ、OTOH、どんどん補っていきます。

于 2010-01-25T04:24:08.450 に答える
1

単純な理由: 下位互換性。

于 2010-01-24T11:22:43.767 に答える