Wie funktioniert „304 Not Modified“ genau?


174
  • Wie werden "304 nicht geändert" -Antworten generiert?

  • Wie ermittelt ein Browser, ob die Antwort auf eine HTTP-Anfrage 304 lautet?

  • Wird es vom Browser eingestellt oder vom Server gesendet?

  • Woher kennt der Server die im Cache verfügbaren Daten, wenn er vom Server gesendet wird, und wie setzt er 304 auf ein Image?

Meine Vermutung, wenn es vom Browser generiert wird:

function is_modified()
{
    return get_data_from_cache() === get_data_from_url();
}

function get_data_from_cache()
{
    return some_hash_or_xxx_function(cache_data);
}

function get_data_from_url()
{
     return some_hash_or_xxx_function(new_data);
}

function some_hash_or_xxx_function(data)
{
     // Do something with the data.
     // What is that algorithm?
     return result;
}

console.log(is_modified());

Ich verlasse mich auf einen Drittanbieter-API-Anbieter, um Daten abzurufen, zu analysieren und in meine Datenbank zu übertragen. Die Daten können sich während jeder Anforderung ändern oder nicht, aber der Header sendet immer 200. Ich möchte nicht analysieren, die letzte eindeutige ID in der Datenbank überprüfen und so weiter ... um die Änderung der Daten zu bestimmen, noch das Ergebnis direkt vergleichen, sondern ich md5(), sha1()und crc32()das Ergebnis hashen und funktioniert einwandfrei, aber ich wundere mich über die Algorithmus zu bestimmen 304.

Ich möchte dieselbe Art von Algorithmus verwenden, um die Änderung meiner Daten zu bestimmen.


2
Ja, ich habe gegoogelt, wie 304 nicht modifiziert funktioniert , aber keine Antwort erhalten.
VenomVendor

1
Sie müssen etwas allgemeiner sein. google.com/search?q=http%20caching
SLaks

Antworten:


200

Wenn der Browser etwas in seinen Cache legt, speichert er auch den Last-Modifiedoder ETag-Header vom Server.

Der Browser sendet dann eine Anfrage mit dem If-Modified-Sinceoder If-None-Match-Header und weist den Server an, eine 304 zu senden, wenn der Inhalt noch dieses Datum oder ETag hat.

Der Server benötigt eine Möglichkeit, für jede Version jeder Ressource ein Datumsänderungs- oder ETag zu berechnen. Dies kommt normalerweise aus dem Dateisystem oder einer separaten Datenbankspalte.


1
ETagIst das Schlüsselwort, überprüft mit Überschriften ETagbleibt in beiden Response Headers& gleich Response Headers From Cache, können Sie den Algorithmus dahinter erkennen ETag. Ich habe meine Frage unter Angabe meiner Anforderung aktualisiert.
VenomVendor

4
@VenomVendor: ETagist nur ein Feld, in dem der Server eine eindeutige ID speichern kann (normalerweise eine Hash- oder Versionsnummer oder eine Vektoruhr). Es hilft Ihnen überhaupt nicht, diese ID zu berechnen. Das liegt an Ihrem serverseitigen Code.
SLaks

@SLaks: Was passiert, wenn die Seite einen Datenbankaufruf hat ... Es besteht die Möglichkeit, dass sich die Daten in der Datenbank geändert haben. In diesem Fall ist es nicht sinnvoll, nach dem zuletzt geänderten Aufruf zu suchen. Richtig?. Wie wird dieser Zustand untersucht?
user1050619

3
@ user1050619: Es liegt an Ihrem Server, sicherzustellen, dass das ETag korrekt ist. Wenn Sie Daten aus einer Datenbank anzeigen, müssen Sie diese einschließen.
SLaks

Eine Sache, die noch unklar ist, ist, ob max-ageder Browser die Anfrage stellen muss, wenn Sie eine große haben ? (da es in 304 stub und die Anfrage überhaupt nicht machen könnte) ... Sie möchten dies zB mit "Fingerabdruck" Assets (sie sind für immer gut). Sonst, was ist der Sinn von max-age...
Andy Hayden

19

Letzte Änderung: Das Datum der letzten Änderung für das angeforderte Objekt

If-Modified-Since: Ermöglicht die Rückgabe eines 304 Not Modified, wenn das Datum der letzten Änderung unverändert bleibt.

ETag: Ein ETag ist eine undurchsichtige Kennung, die von einem Webserver einer bestimmten Version einer Ressource zugewiesen wird, die unter einer URL gefunden wird. Sollte sich die Ressourcendarstellung unter dieser URL jemals ändern, wird ein neues und anderes ETag zugewiesen.

If-None-Match: Ermöglicht die Rückgabe eines 304 Not Modified, wenn ETag unverändert bleibt.

Der Browser-Speicher-Cache mit einem Datum (zuletzt geändert) oder einer ID (ETag). Wenn Sie die URL erneut anfordern müssen, sendet der Browser eine Anforderungsnachricht mit dem Header:

Geben Sie hier die Bildbeschreibung ein

Der Server gibt 304 zurück, wenn die if-Anweisung False ist, und der Browser verwendet den Cache.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.