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.
quelle
Antworten:
Wenn der Browser etwas in seinen Cache legt, speichert er auch den
Last-Modified
oderETag
-Header vom Server.Der Browser sendet dann eine Anfrage mit dem
If-Modified-Since
oderIf-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.
quelle
ETag
Ist das Schlüsselwort, überprüft mit ÜberschriftenETag
bleibt in beidenResponse Headers
& gleichResponse Headers From Cache
, können Sie den Algorithmus dahinter erkennenETag
. Ich habe meine Frage unter Angabe meiner Anforderung aktualisiert.ETag
ist 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.max-age
der 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 vonmax-age
...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:
Der Server gibt 304 zurück, wenn die if-Anweisung False ist, und der Browser verwendet den Cache.
quelle