Was ist der Unterschied zwischen dem HTTP-Statuscode 200 (Cache) und dem Statuscode 304?

201

Ich verwende das Google-Plug-In "Page Speed" für Firefox, um auf meine Website zuzugreifen.

Einige der Komponenten auf meiner Seite werden als HTTP-Status angezeigt:

200 200 (Cache) 304

Mit Googles "Seitengeschwindigkeit".

Was mich verwirrt, ist der Unterschied zwischen 200 (Cache) und 304.

Ich habe die Seite mehrmals aktualisiert (aber meinen Cache nicht geleert) und es scheint immer, dass meine favicon.ico und einige Bilder den Status = 200 (Cache) haben, während einige andere Bilder den http-Status 304 haben.

Ich verstehe nicht warum der Unterschied.

UPDATE :

Mit Google "Page Speed" erhalte ich eine "200 (Cache)" für http://example.com/favicon.ico sowie http://cdn.example.com/js/ga.js

Ich erhalte jedoch den http-Status "304" für http://cdn.example.com/js/combined.min.js

Ich verstehe nicht, warum sich zwei JavaScript-Dateien im selben Verzeichnis / js / befinden, von denen eine einen http-Status 304 und die andere einen 200-Statuscode (Cache) zurückgibt.

Strang
quelle

Antworten:

220

Die Elemente mit dem Code "200 (Cache)" wurden direkt aus Ihrem Browser-Cache erfüllt. Dies bedeutet, dass die ursprünglichen Anforderungen für die Elemente mit Überschriften zurückgegeben wurden, die darauf hinweisen, dass der Browser sie zwischenspeichern kann (z. B. mit Zukunftsdatum Expiresoder Cache-Control: max-ageÜberschriften) Als Sie die neue Anforderung ausgelöst haben, wurden diese zwischengespeicherten Objekte noch im lokalen Cache gespeichert und waren noch nicht abgelaufen.

304s hingegen sind die Antwort des Servers, nachdem der Browser überprüft hat, ob eine Datei seit der letzten zwischengespeicherten Version geändert wurde (die Antwort lautet "Nein").

Um eine optimale Webleistung zu erzielen, legen Sie am besten eine ferne Zukunft Expires:oder einen Cache-Control: max-ageHeader für alle Assets fest. Wenn dann ein Asset geändert werden muss, ändern Sie den tatsächlichen Dateinamen des Assets oder hängen Sie eine Versionszeichenfolge an Anforderungen für dieses Asset an. Dadurch entfällt die Notwendigkeit einer Anforderung, es sei denn, das Asset hat sich definitiv von der Version im Cache geändert (diese 304-Antwort ist nicht erforderlich). Google hat weitere Details zur korrekten Verwendung des Langzeit-Caching .

Ben Regenspan
quelle
2
Was ist aus Geschwindigkeitssicht besser zu haben ... "200 (Cache)" oder "304" http-Statusmeldungen?
Hank
22
200 Cache. Einige gute Hinweise dazu hier: developer.yahoo.com/performance/rules.html#expires . Sie möchten eine möglichst lange Ablaufzeit für Ihr Vermögen, müssen dies jedoch mit der Tatsache abwägen, dass Sie auf diese Weise ein gewisses Maß an Kontrolle verlieren. Eine Sache, die Sie tun können, ist, dauerhafte Abläufe für Dateien festzulegen und dann bei Bedarf eine Versionsnummer des Assets für diese Dateien zu erhöhen. Beispielsweise können Sie style.css? V1 einfügen und das <link> -Element in style.css? V2 erhöhen, wenn Änderungen vorgenommen werden.
Ben Regenspan
1
Gerechtigkeit, warum meldet Firebug, dass für die Datei ga.js aus dem lokalen Cache gezogen wird (Status = 200 Cache), während die kombinierte Datei min.js einen HTTP-Status von 304 meldet? Seltsam ist, dass beide Dateien denselben Dateityp (JavaScript) haben und sich im selben Serververzeichnis befinden. Sie würden denken, beide wären entweder 200 oder 304 und nicht anders
Hank
8
Die max-ageund age-Header zusammen können auch zu 200 (Cache-) Ergebnissen führen, wenn sie agekleiner als sind max-age. Die einzige Ausnahme ist, wenn der Benutzer auf die Schaltfläche zum Aktualisieren des Browsers klickt. In diesem Fall wird ein 304-Header gesendet.
Yitwail
2
HTML5 Boilerplate rät davon ab, die Abfragezeichenfolgenmethode für das Cache-Busting zu verwenden. Es ist besser, die und Verweise auf jede Datei so zu ändern href, dass sie einen 'Fingerabdruck' (entweder einen Hash der Datei oder eine einfache inkrementierte Nummer) enthalten, und dies dann dem Server mitzuteilen diesen Fingerabdruck abziehen und einfach dienen oder was auch immer. Wenn Sie dies auf dem Server nicht tun können, lassen Sie Ihr Build-System die tatsächlichen Dateien mit dem Fingerabdruck umbenennen. url,srcstyle.css
Iono
62

200 (Cache) bedeutet, dass Firefox einfach die lokal zwischengespeicherte Version verwendet. Dies ist die schnellste, da keine Anforderung an den Webserver erfolgt.

304 bedeutet, dass Firefox eine bedingte Anforderung "If-Modified-Since" an den Webserver sendet. Wenn die Datei seit dem vom Browser gesendeten Datum nicht aktualisiert wurde, gibt der Webserver eine 304-Antwort zurück, die Firefox im Wesentlichen anweist, die zwischengespeicherte Version zu verwenden. Es ist nicht so schnell wie 200 (Cache), da die Anforderung weiterhin an den Webserver gesendet wird, der Server jedoch den Inhalt der Datei nicht senden muss.

Auf Ihre letzte Frage weiß ich nicht, warum die beiden JavaScript-Dateien im selben Verzeichnis unterschiedliche Ergebnisse liefern.

James Lawruk
quelle
18

Das hat mich auch lange geworfen. Das erste, was ich überprüfen würde, ist, dass Sie die Seite nicht neu laden, indem Sie auf die Schaltfläche "Aktualisieren" klicken. Dies gibt immer eine bedingte Anforderung für Ressourcen aus und gibt 304s für viele der Seitenelemente zurück. Gehen Sie stattdessen zur URL-Leiste, wählen Sie die Seite aus und drücken Sie die Eingabetaste, als hätten Sie gerade dieselbe URL erneut eingegeben. Dadurch erhalten Sie einen besseren Indikator dafür, was ordnungsgemäß zwischengespeichert wird. Dieser Artikel erklärt hervorragend den Unterschied zwischen bedingten und bedingungslosen Anforderungen und wie sich die Schaltfläche "Aktualisieren" auf sie auswirkt: http://blogs.msdn.com/b/ieinternals/archive/2010/07/08/technical-information-about- Bedingte-http-Anfragen-und-die-Aktualisierung-button.aspx

Hündchen
quelle
1
Ich kann nicht einmal beschreiben, wie viel Zeit ich damit verbracht habe, den Status von Anfragen an CDN herauszufinden. Obwohl Sie eine etwas andere Frage beantworten, verdienen Sie ein Kopfgeld :-)
Peeech
Sie haben Recht: Der Unterschied in den Codes hängt damit zusammen, dass Sie neu laden oder nicht dieselbe Seite. Wenn ich eine Seite neu lade, wird im Netzwerkmonitor des Browsers ein 304-Code angezeigt. Wenn ich jedoch auf eine andere URL zugreife, die dieselben Dateien verwendet, wird im Netzwerkmonitor des Browsers ein 200-Code (aus dem Cache) angezeigt. In meinem Fall war die andere URL nur eine Abfragezeichenfolge, die an die ursprüngliche URL angehängt wurde (die Seite war im wesentlichen das gleiche).
Aldemarcalazans
8

HTTP 304 ist "nicht geändert". Ihr Webserver teilt dem Browser im Grunde mit, dass sich diese Datei seit der letzten Anforderung nicht geändert hat. Während ein HTTP 200 dem Browser mitteilt, dass "hier eine erfolgreiche Antwort vorliegt", sollte diese zurückgegeben werden, wenn Ihr Browser entweder zum ersten Mal auf die Datei zugreift oder zum ersten Mal auf eine geänderte Kopie zugegriffen wird.

Weitere Informationen zu Statuscodes finden Sie unter http://en.wikipedia.org/wiki/List_of_HTTP_status_codes .

Richleland
quelle
Das ist auch mein Verständnis ... weshalb ich in meinem ursprünglichen Beitrag angegeben habe, dass ich meine Seite mehrmals aktualisiert habe und immer noch die "200 (Cache)" für dieselbe favicon.ico und bestimmte JavaScript-Includes bekomme, die ich habe. Sehr seltsam
Hank
2
200 bedeutet eigentlich nicht zwischengespeichert, sondern nur OK. Es besteht die Möglichkeit, dass Ihre Serverkonfiguration den Browser nicht explizit anweist, Ihre ico- und js-Dateien zwischenzuspeichern, wodurch ein Statuscode von 200 zurückgegeben wird.
richleland
Dies ist bei einigen meiner JavaScript-Dateien nicht der Fall. Ich erhalte eine 304 und bei anderen JavaScript-Dateien eine "200 (Cache)". Alle JavaScript befindet sich im selben Webserver-Verzeichnis example.com/js/
Hank
Ich sollte hinzufügen, dass 200 (Cache) nur bedeutet, dass es lokal zwischengespeichert ist und keine Anfrage an den Server stellt, was schneller sein wird, als zum Server zu gehen und eine 304-Antwort zu erhalten.
Richleland
Ich habe meinen ursprünglichen Beitrag aktualisiert, um meine Live-Site und das betreffende JavaScript anzuzeigen. Bitte beachten Sie meinen aktualisierten Originalbeitrag.
Hank
2

Für Ihre letzte Frage, warum? Ich werde versuchen, mit dem zu erklären, was ich weiß

Eine kurze Erklärung dieser drei Statuscodes in Laienbegriffen.

  • 200 - Erfolg (Browseranfragen und Abrufen der Datei vom Server)

Wenn das Caching auf dem Server aktiviert ist

  • 200 (aus dem Speichercache) - Datei im Browser gefunden, sodass der Browser keine Anforderung vom Server ausführt
  • 304 - Browser fordert eine Datei an, die jedoch vom Server abgelehnt wird

Bei einigen Dateien entscheidet sich der Browser für eine Anforderung vom Server und bei einigen für das Lesen aus gespeicherten (zwischengespeicherten) Dateien. Warum ist das ? Jede Datei hat also ein Ablaufdatum

Wenn eine Datei nicht abgelaufen ist, verwendet der Browser aus dem Cache (200 Cache).

Wenn die Datei abgelaufen ist, fordert der Browser den Server nach einer Datei an. Serverprüfdatei an beiden Stellen (Browser und Server). Wenn dieselbe Datei gefunden wird, lehnt der Server die Anforderung ab. Gemäß Protokoll verwendet der Browser die vorhandene Datei.

Schauen Sie sich diese Nginx-Konfiguration an

location / {
    add_header Cache-Control must-revalidate;
    expires     60;
    etag on;

    ...
}

Hier ist der Ablauf auf 60 Sekunden eingestellt, sodass alle statischen Dateien für 60 Sekunden zwischengespeichert werden. Wenn Sie also innerhalb von 60 Sekunden erneut eine Datei anfordern, liest der Browser aus dem Speicher (200 Speicher). Wenn Sie nach 60 Sekunden eine Anfrage stellen, fordert der Browser den Server an (304).

Ich nahm an, dass die Datei nach 60 Sekunden nicht geändert wird. In diesem Fall erhalten Sie 200 (dh die aktualisierte Datei wird vom Server abgerufen).

Wenn die Server mit unterschiedlichen ablaufenden und zwischengespeicherten Headern (Richtlinien) konfiguriert sind, kann sich der Status unterscheiden.

In Ihrem Fall, in dem Sie cdn verwenden, ist der Hauptzweck von cdn die hohe Verfügbarkeit und die schnelle Lieferung. Daher verwenden sie mehrere Server. Obwohl sich Dateien anscheinend im selben Verzeichnis befinden, verwendet cdn möglicherweise mehrere Server, um u-Inhalte bereitzustellen, wenn diese Server unterschiedliche Konfigurationen haben. Dann kann sich dieser Status ändern. Ich hoffe es hilft.

Saahithyan Vigneswaran
quelle
Der 304 - Nicht geändert ist keine "Ablehnung" durch den Server. Es ist der Server, der dem Client erklärt, "für die Version, die Sie anfordern, ich weiß, dass sie nicht geändert wird, Sie brauchen die Datei nicht wirklich". Technisch gesehen ist 304 einer der "Umleitungs" -Antwortcodes. Es sagt dem Client "hol es aus deinem eigenen Cache".
Bob Kuhar