web-dev-qa-db-ja.com

if-modified-sinceとif-none-match

If-modified-sinceとif-none-matchの違いは何ですか? if-none-matchはファイルに使用され、if-modified-sinceはページに使用されていると感じていますか?

86
Tower

Last-Modified/If-Modified-SinceETag/If-None-Matchの違いについて:

両方を同じ意味で使用できます。ただし、リソースのタイプとサーバー上での生成方法に応じて、1つまたは他の質問(「これは...以降に変更されていますか?」/「これはまだこのETagと一致しますか?」) 。

例:

  • ファイルを提供する場合、ファイルのmtimeLast-Modified日付として使用するのが最も簡単なソリューションです。
  • 多数のSQLクエリから構築された動的なWebページを提供している場合、それらのクエリのいずれかによって返されるデータが変更されたかどうかを確認することは実用的ではありません。この場合、例えばETagとしてのページコンテンツのmd5ハッシュは、はるかに簡単になります。
    OTOH、これは、条件付きGETの場合でも、サーバー上でページ全体を生成する必要があることを意味します。 ETagに正確に入力する必要があるもの(プライマリキー、リビジョン番号など)を把握することで、ここでの時間を大幅に節約できます。

トピックの詳細については、次のリンクを参照してください。

108
trendels

If-Modified-SinceLast-Modified に対して If-None-MatchETag と比較されます。両方 Modified-SinceおよびETagは、リソースの特定のバリアントを識別するために使用できます。

しかし、If-Modified-SinceからLast-Modifiedは、キャッシュされたバリアントがoldernewerかを示します一方、If-None-Match to ETagは、両方がidenticalであるかどうかの情報を提供します。さらに、ほとんどのETagジェネレーターにはシステム固有の情報 inode が含まれているため、ファイルを別のドライブに移動するとETagも変更される可能性があります。

22
Gumbo

Last-Modified/If-Modified-Sinceで使用されるタイムスタンプ値の精度は限られています-1秒であり、たとえば1秒に複数のメッセージが投稿される可能性のあるWebチャットアプリケーションのような高速に変化するコンテンツには不十分です。 ETag/If-None-Matchは、この問題の解決に役立ちます。

13
Alex K

グーグルのベストプラクティスで述べられているように:

すべてのキャッシュ可能なリソースに対して、ExpiresまたはCache-Control max-ageのいずれか、およびLast-ModifiedまたはETagのいずれかを指定することが重要です。 ExpiresとCache-Control:max-ageの両方を指定するか、Last-ModifiedとETagの両方を指定することは冗長です。

https://developers.google.com/speed/docs/best-practices/caching

8

If-Modified-Since は日付を使用しますが、 If-None-MatchETag を使用します。これらは両方とも「ページ」(つまりHTML)と他のファイルに使用できます。

5

サーバーによって弱いと記載されていない限り、ETagは強力なバリデーターと見なされるため、条件付きの範囲の要求を満足させるために使用できます。ただし、ほとんどの自動生成されたETagは、サーバーファームの状況で困難を示します。これは、多くの場合、iノード情報や一意の永続カウンターを使用するためです。実際には、かなり変更されたコンテンツには、Last Modifiedヘッダーで十分であることがわかりました。保護された静的コンテンツを提供します。これは、ファイルの書き込み時間が妥当なバリデーターになるためです。

ETagは、これまでで最も柔軟です。適合クライアントは、条件付きリクエストでETagを送信する必要がありますが、可能であれば両方を送信する必要があります。

3
Thomas S. Trias

If-Modified-Sinceヘッダーは、ブラウザーが要求されたリソースを最後に受信した時刻を指定するために使用されます。 If-None-Matchヘッダーは、要求されたリソースが最後に受信されたときにサーバーが発行したエンティティタグを指定するために使用されます。

説明されている2つの方法で、これらのヘッダーはブラウザー内のコンテンツのキャッシュをサポートするために使用され、サーバーはブラウザーがリソースの完全なコンテンツで応答するのではなく、リソースのキャッシュされたコピーを使用するようにブラウザーに指示できるようにします必要はありません。

0
Serhan M.