Was hat Vorrang: der ETag- oder der zuletzt geänderte HTTP-Header?

82

Welcher der folgenden beiden Header wird bei zwei nachfolgenden Anforderungen von Browsern stärker gewichtet, sollte einer von ihnen geändert werden: ETag oder Last-Modified?

user101442
quelle

Antworten:

90

Gemäß RFC 2616, Abschnitt 13.3.4, MUSS ein HTTP 1.1-Client das ETag in allen Cache-bedingten Anforderungen verwenden. Wenn sowohl ein ETag als auch Last Modified vorhanden sind, sollte er beide verwenden. Der ETag-Header wird als starker Validator angesehen (siehe Abschnitt 13.3.3), sofern er nicht vom Server ausdrücklich als schwach deklariert wird, während der Header "Zuletzt geändert" als schwach angesehen wird, sofern nicht mindestens ein winziger Unterschied zwischen ihm und dem Datums-Header besteht. Beachten Sie jedoch, dass der Server auch nicht senden muss (dies sollte jedoch geschehen, wenn dies möglich ist).

Beachten Sie, dass der Client die Header nicht überprüft, um festzustellen, ob sie sich geändert haben. es verwendet sie nur blind in der nächsten bedingten Anfrage; Es ist Sache des Servers, zu bewerten, ob der angeforderte Inhalt oder eine nicht geänderte Antwort gesendet werden soll. Wenn der Server nur einen sendet, verwendet der Client diesen allein (obwohl nur starke Validatoren für eine Bereichsanforderung nützlich sind). Natürlich liegt es auch im Ermessen der Zwischen-Caches (es sei denn, sie wurden über Cache-Steuerungsanweisungen am Caching gehindert) und des Servers, wie sie auf die Header reagieren. Der RFC gibt an, dass er NICHT 304 Not Modified zurückgeben darf, wenn die Validatoren inkonsistent sind. Da die Header-Werte jedoch vom Server generiert werden, hat er einiges an Spielraum.

In der Praxis habe ich festgestellt, dass Chrome, FireFox und IE 7+ beide Header senden, sofern verfügbar. Ich habe auch das Verhalten beim Senden geänderter Header getestet, was ich bereits anhand der Informationen im RFC vermutet hatte. Die vier von mir getesteten Clients haben nur bedingte Anforderungen gesendet, wenn die Seite (n) aktualisiert wurden oder wenn die Seite zum ersten Mal vom aktuellen Prozess angefordert wurde.

Thomas S. Trias
quelle
1
Tolle Antwort, Thomas. Vielen Dank, dass Sie die offizielle Spezifikation bereitgestellt und aktuelle Browser-Implementierungen besprochen haben.
Dthrasher
1
In Abschnitt 14.26 darf der Server die angeforderte Methode NICHT ausführen, es sei denn, dies ist erforderlich, da das Änderungsdatum der Ressource nicht mit dem übereinstimmt, das in einem Header-Feld "If-Modified-Since" in der Anforderung angegeben ist. Sieht so aus, als hätte If-Modified-Since Vorrang.
Vikar
20

Ist es nicht eher ein "ODER" -Ausdruck? Im Pseudocode:

if ETagFromServer != ETagOnClient || LastModifiedFromServer != LastModifiedOnClient
   GetFromServer
else
   GetFromCache
Gidon
quelle
4
Ich denke, der zuletzt geänderte Zeitstempel sollte anders verglichen werden, wie in: if ETagFromServer! = ETagOnClient || LastModifiedFromServer> LastModifiedOnClient
RoyM
Es ist eine AND-Anweisung, da das ETag möglicherweise schwach ist. In diesem Fall könnten Sie eine semantisch äquivalente Entität haben und dann auf den zuletzt geänderten Header zurückgreifen. Stellen Sie sich eine Situation vor, in der ein Bild neu codiert werden könnte, und wir möchten sagen, dass das Original und die Neucodierung identisch sind, obwohl sie nicht byteidentisch sind. In diesem Fall möchten wir die zuletzt modifizierten als Fallback verwenden und deshalb müssen sie
beide
8

=! ist der richtige Vergleichsoperator. Der Client muss die vom Server empfangene Literalzeichenfolge beibehalten, da durch Konvertierungen kleine Unterschiede entstehen können. Sie können nicht davon ausgehen, dass "neuer ist besser".

Warum? Stellen Sie sich den Fall vor, in dem der Serverbetreiber eine fehlerhafte Version einer Ressource zurücksetzt. Die zurückgesetzte Version ist ÄLTER - aber korrekt.

Der Client muss die aktuell vom Server angebotene Version verwenden. Eine zwischengespeicherte Version kann nur verwendet werden, wenn sie identisch ist. Daher muss der Server die Gleichheit prüfen, nicht "neuer".

AccuracyInReponses
quelle