web-dev-qa-db-ja.com

優先されるもの:ETagまたはLast-Modified HTTPヘッダー

後続の2つのリクエストの場合、次の2つのヘッダーのいずれかが変更されると、ブラウザーによってより大きな重みが与えられます:ETagまたはLast-Modified?

80
user101442

RFC 2616 セクション13.3.4によると、HTTP 1.1クライアントはキャッシュ条件付きリクエストでETagを使用する必要があり、ETagとLast Modifiedの両方が存在する場合、両方を使用する必要があります。 ETagヘッダーは、サーバーによって明示的に弱いと宣言されない限り、強力なバリデーターと見なされます(セクション13.3.3を参照)。ただし、サーバーも送信する必要はありません(ただし、可能であればSHOULD)。

クライアントは、ヘッダーが変更されたかどうかを確認するためにヘッダーをチェックしないことに注意してください。次の条件付きリクエストでそれらを盲目的に使用します。要求されたコンテンツを送信するか、304 Not Modified応答を送信するかを評価するのはサーバー次第です。サーバーが1つだけを送信する場合、クライアントはその1つだけを使用します(ただし、範囲要求には強力なバリデーターのみが有用です)。もちろん、中間キャッシュ(ヘッダーがCache Controlディレクティブによってキャッシュされない限り)およびサーバーがヘッダーにどのように作用するかについては、自由裁量です。 RFCは、バリデーターが一貫していない場合、304 Not Modifiedを返してはいけないと述べていますが、ヘッダー値はサーバーによって生成されるため、かなりの余裕があります。

実際には、Chrome、FireFox、およびIE 7+は両方のヘッダーを送信します(可能な場合)。また、情報から既に疑っていた変更されたヘッダーを送信するときの動作もテストしました。 RFCでテストした4つのクライアントは、ページが更新された場合、または現在のプロセスによってページが初めて要求された場合にのみ条件付き要求を送信しました。

88
Thomas S. Trias

「OR」式のようなものではありませんか。擬似コードで:

if ETagFromServer != ETagOnClient || LastModifiedFromServer != LastModifiedOnClient
   GetFromServer
else
   GetFromCache
20
Gidon

=!正しい比較演算子です。変換によって小さな違いが生じる可能性があるため、クライアントはサーバーから受け取ったリテラル文字列を保持する必要があります。 「新しい方が良い」と仮定することはできません。

どうして?サーバーオペレーターが不良バージョンのリソースを元に戻す場合を考えます。元に戻したバージョンは古いですが、正しいです。

クライアントは、サーバーが現在提供しているバージョンを使用する必要があります。同じバージョンである場合にのみ、キャッシュバージョンを使用できます。したがって、サーバーは「新しい」ではなく、同等性をチェックする必要があります。

8