if-modified-sinceとif-none-matchの違いは何でしょうか?ファイルにはif-none-matchが使用されているのに対し、ページにはif-modified-sinceが使用されているような気がしますか?
7 に答える
Last-Modified/If-Modified-Since
との違いについてETag/If-None-Match
:
どちらも同じように使用できます。ただし、リソースのタイプとサーバーでのリソースの生成方法によっては、どちらかの質問(「これは...以降に変更されていますか?」/「これはまだこのETagと一致しますか?」)の方が答えやすい場合があります。 。
例:
- ファイルを提供している場合は、ファイルを日付として使用するの
mtime
がLast-Modified
最も簡単な解決策です。 - 多数のSQLクエリから構築された動的Webページを提供している場合、それらのクエリのいずれかによって返されるデータが変更されているかどうかを確認することは実用的でない場合があります(すべてに何らかの「最終変更」列がない場合)。この場合、たとえばページコンテンツのmd5ハッシュを使用
ETag
すると、はるかに簡単になります。
OTOH、これは、条件付きGETの場合でも、サーバー上にページ全体を生成する必要があることを意味します。ETagに正確に何を入力する必要があるか(主キー、リビジョン番号など)を把握することで、ここで多くの時間を節約できます。
トピックの詳細については、次のリンクを参照してください。
If-Modified-Since
と比較されますがLast-Modified
、If-None-Match
と比較されETag
ます。との両方Modified-Since
をETag
使用して、リソースの特定のバリアントを識別できます。
ただし、If-Modified-Since
toを比較するとLast-Modified
、キャッシュされたバリアントが古いか新しいIf-None-Match
かがわかりますが、 toを比較すると、ETag
両方が同一かどうかがわかります。さらに、ほとんどのETag
ジェネレーターにはシステム固有のiノードの情報が含まれているため、ファイルを別のドライブに移動すると、ETag
同様に変更される可能性があります。
Last-Modified / If-Modified-Sinceで使用されるタイムスタンプ値の精度は制限されています-1秒であり、たとえば、任意の1秒間に複数のメッセージが投稿される可能性があるWebチャットアプリケーションなど、急速に変化するコンテンツには不十分です。 。ETag / If-None-Matchは、その問題の解決に役立ちます。
グーグルのベストプラクティスに記載されているように:
すべてのキャッシュ可能なリソースに対して、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
If-Modified-Sinceは日付を使用しますが、If-None-MatchはETagを使用します。これらは両方とも「ページ」(つまりHTML)と他のファイルに使用できます。
サーバーによって弱いと述べられていない限り、ETagは強力なバリデーターと見なされるため、条件付きの範囲指定された要求を満たすために使用できます。ただし、ほとんどの自動生成されたETagは、iノード情報や一意の永続カウンターを使用することが多いため、サーバーファームの状況では問題が発生します。実際には、ファイルの書き込み時間が適度に優れたバリデーターになるため、Last Modifiedヘッダーは、保護された静的コンテンツを提供するなど、かなり静的なコンテンツには十分であることがわかりました。
ETagは群を抜いて最も柔軟性があります。準拠しているクライアントは、条件付きリクエストでETagを送信する必要がありますが、可能な場合は両方を送信する必要があります。
If-Modified-Sinceヘッダーは、ブラウザーが要求されたリソースを最後に受信した時刻を指定するために使用されます。If-None-Matchヘッダーは、サーバーが最後に受信したときに要求されたリソースで発行したエンティティタグを指定するために使用されます。
説明した2つの方法で、これらのヘッダーはブラウザ内のコンテンツのキャッシュをサポートするために使用され、サーバーがリソースの完全なコンテンツで応答するのではなく、リソースのキャッシュされたコピーを使用するようにブラウザに指示できるようにします。必要はありません。