if-modifiziert-seit vs if-keine-Übereinstimmung

88

Was könnte der Unterschied zwischen If-Modified-Since und If-None-Match sein? Ich habe das Gefühl, dass If-None-Match für Dateien verwendet wird, während If-Modified-Since für Seiten verwendet wird.

Turm
quelle

Antworten:

110

In Bezug auf die Unterschiede zwischen Last-Modified/If-Modified-SinceundETag/If-None-Match :

Beide können austauschbar verwendet werden. Abhängig von der Art der Ressource und der Art und Weise, wie sie auf dem Server generiert wird, ist die eine oder andere Frage ("Wurde dies seit ... geändert?" / "Stimmt dies immer noch mit diesem ETag überein?") Möglicherweise einfacher zu beantworten .

Beispiele:

  • Wenn Sie Dateien bereitstellen, ist die Verwendung der Dateien mtimeals Last-ModifiedDatum die einfachste Lösung.
  • Wenn Sie eine dynamische Webseite bereitstellen, die aus einer Reihe von SQL-Abfragen besteht, kann es unpraktisch sein, zu überprüfen, ob sich die von einer dieser Abfragen zurückgegebenen Daten geändert haben (es sei denn, alle haben eine "zuletzt geänderte" Spalte). In diesem Fall ist die Verwendung von z. B. einem MD5-Hash des Seiteninhalts ETagviel einfacher.
    OTOH, dies bedeutet, dass Sie auch für ein bedingtes GET noch die gesamte Seite auf dem Server generieren müssen. Wenn Sie herausfinden, was genau in das ETag aufgenommen werden muss (Primärschlüssel, Versionsnummern usw.), können Sie hier viel Zeit sparen.

Weitere Informationen zum Thema finden Sie unter diesen Links:

Trends
quelle
Ich habe dem Browser einen ETag gesendet, aber er fordert niemals dieselbe Seite mit If-None-Match an. Was kann das Problem sein?
Pacerier
2
@pacerier: Für die Verwendung von Etag sind keine Browser erforderlich. Es könnte also ein alter Browser sein und ihn einfach ignorieren. Die andere Möglichkeit besteht darin, dass auf die Entität mit URL-Parametern zugegriffen wird, die sich von Aufruf zu Aufruf ändern. Wenn sich der Entitätsname ändert, wird etag nicht für verschiedene Anforderungen verwendet.
Rafael Baptista
@RafaelBaptista Um mehr über Ihre zweite Hälfte des Kommentars zu erfahren, sagen wir, ich habe folgende Situation: Ich habe einen Dateiserver und der Server unterstützt die Versionierung mit ETags. Aus Gründen der Abwärtskompatibilität verwendeten Clients früher einen Abfrageparameter my_current_version = (version ). Wenn ich eine HTTP-Anforderung mit unterschiedlichen Werten für my_current_version, aber auch für ETags sende, welches Kriterium wird dann als bewährte Methode priorisiert, wenn festgelegt wird, ob eine neue Version bereitgestellt oder eine 304 zurückgesendet werden soll? Vielen Dank!
Laughing_man
1
Wie der Server Etag verwendet, hängt vom Server ab. Sie können wahrscheinlich die meisten Dateiserver so konfigurieren, dass Parameter mit etag ignoriert werden, wenn Sie dies über Umschreiberegeln möchten. Sie haben weniger Kontrolle über den Client - den Browser. Die meisten senden keinen etag-Header, den sie für einen Parametersatz in einer Anforderung für einen anderen erhalten haben. Eine Client-Anfrage für Bild? V = 1 sendet nicht das gleiche Etag für Bild? V = 2. Wenn ich meine eigenen Server schreiben würde, würde ich etag als Hash des Bildinhalts implementieren. Jede URL, die nach einer Ressource fragt und mit einem Etag versehen ist, das dem Hash des Bildes entspricht, das ich senden würde, gebe ich 304 zurück.
Rafael Baptista
22

If-Modified-Sincewird mit dem verglichen, Last-Modifiedwährend If-None-Matchmit verglichen wird ETag. Beides Modified-Sinceund ETagkann verwendet werden, um eine bestimmte Variante einer Ressource zu identifizieren.

Der Vergleich von If-Modified-Sinceto Last-Modifiedgibt Ihnen jedoch Auskunft darüber, ob die zwischengespeicherte Variante älter oder neuer ist, während der Vergleich von If-None-Matchto ETagnur Auskunft darüber gibt, ob beide identisch sind oder nicht. Darüber hinaus enthalten die meisten ETagGeneratoren die Informationen des systemspezifischen Inodes, sodass das Verschieben einer Datei auf ein anderes Laufwerk dies ebenfalls ändern kann ETag.

Gumbo
quelle
Interessant, aber warum sollte ich "identische" Prüfungen gegenüber "zuletzt geänderten" Prüfungen verwenden? Was sind die Vorteile? Wenn Sie eine Datei bereitstellen möchten, welche ist die bessere Option?
Turm
7
Bei Computern ist die Zeit fragil. Schaltsekunden, das Umschalten zwischen Sommerzeit und ungenauen Uhren können dazu führen, dass eine "zuletzt geänderte" Prüfung das falsche Ergebnis zurückgibt. Durch den Vergleich des Inhalts selbst (oder des MD5-Hash des Inhalts) werden diese Probleme vermieden.
Devdanke
Obwohl ich @devdanke vollständig verstehe, würde ich sagen, dass das Überprüfen des Zeitstempels viel schneller ist als das Überprüfen von md5sum. Der Zweck dieser Header besteht darin, sie schnell zu machen. Manchmal wird es bevorzugt, keine neue Version einer Entität auf den Client zu übertragen, als den Server mit E / A zu laden. Auf jeden Fall kann der Benutzer immer Strg + Umschalt + R (oder Strg + F5 oder was auch immer) drücken
Trauer
13

Der in Last-Modified / If-Modified-Since verwendete Zeitstempelwert hat eine begrenzte Genauigkeit - eine Sekunde. Dies reicht einfach nicht aus, um Inhalte schnell zu ändern, z. B. eine Web-Chat-Anwendung, bei der mehr als eine Nachricht pro Sekunde gesendet werden kann . ETag / If-None-Match kann helfen, dieses Problem zu lösen.

Alex K.
quelle
9

Wie in den Best Practices von Google angegeben:

Es ist wichtig, für alle zwischengespeicherten Ressourcen eines der maximalen Alter "Expires" oder "Cache-Control" und eines der Elemente "Last-Modified" oder "ETag" anzugeben. Es ist redundant, sowohl Expires als auch Cache-Control: max-age oder Last-Modified und ETag anzugeben.

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

Dionysios Arvanitis
quelle
Diese URL enthält keinen ähnlichen Text mehr. Es wird keine Einschränkung gegen die Verwendung Last-Modifiedmit ETag(oder auf der Useragent-Seite If-Modified-Sincemit If-None-Match) erwähnt. Ebenso schränkt Sie die W3-Spezifikation nicht ein. Es sagt nicht zu verwenden , If-Modified-Sincemit If-Match, aber ich nehme an das ist , weil die Menge der Dokumente , die Daten aktualisiert haben aber den gleichen Inhalt wie von der ETag definiert sollte recht klein sein.
mpag
3

Sofern vom Server nicht als schwach angegeben, wird ein ETag als starker Validator angesehen und kann daher verwendet werden, um eine bedingte Entfernungsanforderung zu erfüllen. Die meisten automatisch generierten ETags weisen jedoch Schwierigkeiten in Serverfarmsituationen auf, da sie häufig Inode-Informationen und / oder einen eindeutigen dauerhaften Zähler verwenden. In der Praxis habe ich festgestellt, dass der Header "Last Modified" für ziemlich statische Inhalte ausreicht, z. B. für geschützte statische Inhalte, da die Schreibzeit der Datei einen recht guten Validator darstellt.

Der ETag ist bei weitem der flexibelste. Konforme Clients müssen das ETag in einer bedingten Anforderung senden, während sie beide senden sollten, falls verfügbar.

Thomas S. Trias
quelle
0

Der If-Modified-Since-Header wird verwendet, um den Zeitpunkt anzugeben, zu dem der Browser die angeforderte Ressource zuletzt empfangen hat. Der If-None-Match-Header wird verwendet, um das Entitäts-Tag anzugeben, das der Server beim letzten Empfang mit der angeforderten Ressource ausgegeben hat.

Auf die beiden beschriebenen Arten werden diese Header verwendet, um das Zwischenspeichern von Inhalten im Browser zu unterstützen, und sie ermöglichen es dem Server, den Browser anzuweisen, eine zwischengespeicherte Kopie einer Ressource zu verwenden, anstatt in diesem Fall mit dem vollständigen Inhalt der Ressource zu antworten nicht nötig.

Serhan M.
quelle