if-modified-sinceとif-none-match


88

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

回答:


111

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

どちらも同じ意味で使用できます。ただし、リソースのタイプとサーバーでの生成方法によっては、どちらか一方の質問(「これは...以降に変更されていますか?」/「これはまだこのETagと一致していますか?」)の方が答えやすいかもしれません。 。

例:

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

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


ブラウザにETagを送信しましたが、If-None-Matchで同じページをリクエストすることはありません。何が問題なのでしょうか?
パチェリエ

2
@pacerier:Etagを使用するためにブラウザーは必要ありません。したがって、それは古いブラウザであり、単にそれを無視する可能性があります。他の可能性は、エンティティが呼び出しごとに変化するURLパラメータでアクセスされていることです。エンティティ名が変更された場合、etagは別のリクエストに使用されません。
Rafael Baptista、2013年

@RafaelBaptistaコメントの後半についてさらに詳しく説明するには、次のような状況だとします。ファイルサーバーがあり、サーバーはETagを使用したバージョニングをサポートしており、下位互換性の理由から、クライアントにクエリパラメータmy_current_version =(version )。my_current_versionにさまざまな値を使用し、さらにETagも使用してHTTPリクエストを送信する場合、新しいバージョンを提供するか304を返送するかを決定するときに、ベストプラクティスとして、どの基準が優先されますか?ありがとう!
laughing_man

1
サーバーがEtagをどのように使用するかはサーバー次第です。リライトルールを使用する場合は、etagのパラメータを無視するようにほとんどのファイルサーバーを設定できます。クライアント(ブラウザー)に対する制御が弱くなります。ほとんどの場合、別のリクエストのパラメータセットで取得したetagヘッダーは送信しません。image?v = 1に対するクライアント要求は、image?v = 2に対して同じetagを送信しません。私が自分のサーバーを書いていたら、etagを画像コンテンツのハッシュとして実装します。リソースを要求し、私が送信した画像のハッシュと一致したETagが付属して、私は304を返す任意のURL
ラファエル・バプティスタ

22

If-Modified-SinceLast-ModifiedはとIf-None-Match比較されETagますが、はと比較されます。両方Modified-SinceETagリソースの特定の変異体を同定するために用いることができます。

比較しかしIf-Modified-Sinceには、Last-Modifiedキャッシュされた変異体であるかどうかをあなたに情報を与え、古い新しいの比較一方If-None-MatchETagだけ両方があるかどうかをあなたに情報を提供し、同一かどうか。さらに、ほとんどのETagジェネレータにはシステム固有のiノードの情報が含まれているため、ファイルを別のドライブに移動すると、ETag同様に変更される可能性があります。


興味深いですが、なぜ「最終変更」チェックよりも「同一」チェックを使用するのですか?メリットは何ですか?提供するファイルがある場合、どちらが優れたオプションですか?
タワー

7
コンピュータでは、時間は脆弱です。うるう秒、夏時間の切り替え、不正確な時計などはすべて、「最終変更」チェックで間違った結果を返す可能性があります。コンテンツ自体(またはコンテンツのMD5ハッシュ)を比較することで、これらの問題を回避できます。
devdanke

@devdankeを完全に理解しているにもかかわらず、タイムスタンプのチェックはmd5sumのチェックよりもはるかに高速であると言えます。これらのヘッダーの目的は、ヘッダーを高速にすることです。場合によっては、サーバーにI / Oをロードするよりも、エンティティの最新バージョンをクライアントに転送しないほうが好ましいことがあります。とにかく、ユーザーはいつでもctrl + shift + R(またはctrl + F5など)を押すことができます
Grief

13

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


9

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

すべてのキャッシュ可能なリソースに対して、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


そのURLには、そのようなテキストはありません。Last-Modifiedwith ETag(または、useragent側では、If-Modified-Sincewith If-None-Match)の使用に対する制限は記載されていません。同様に、W3仕様はあなたを制限しません。とIf-Modified-Since一緒に使用しないと表示If-Matchされていますが、これは、日付が更新されているが、ETagで定義されているものと同じ内容のドキュメントのセットは非常に小さいためです。
mpag 2016


3

サーバーで弱いと述べられていない限り、ETagは強力なバリデーターと見なされるため、条件付きの範囲付きリクエストを満足させるために使用できます。ただし、ほとんどの場合、自動生成されたETagは、inode情報や一意の永続的なカウンターを使用することが多いため、サーバーファームの状況で問題が発生します。実際には、ファイルの書き込み時間が妥当なバリデーターになるため、保護された静的コンテンツを提供するなど、かなり静的なコンテンツにはLast Modifiedヘッダーで十分であることがわかりました。

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


0

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.