Qual è la differenza tra il codice di stato HTTP 200 (cache) e il codice di stato 304?


201

Sto utilizzando il plug-in "Page Speed" di Google per Firefox per accedere al mio sito web.

Alcuni dei componenti sulla mia pagina sono indicati come stato HTTP:

200 200 (cache) 304

Dalla "Velocità della pagina" di Google.

Ciò di cui sono confuso è la differenza tra 200 (cache) e 304.

Ho aggiornato la pagina più volte (ma non ho cancellato la mia cache) e sembra sempre che il mio favicon.ico e alcune immagini siano status = 200 (cache) mentre alcune altre immagini sono http http 304.

Non capisco perché la differenza.

AGGIORNAMENTO :

Utilizzando Google "Page Speed", ricevo un "200 (cache)" per http://example.com/favicon.ico e http://cdn.example.com/js/ga.js

Ma ricevo lo stato http "304" per http://cdn.example.com/js/combined.min.js

Non capisco perché ho due file JavaScript situati nella stessa directory / js /, uno che restituisce uno stato HTTP 304 e l'altro che restituisce un codice di stato 200 (cache).

Risposte:


220

Gli articoli con il codice "200 (cache)" sono stati soddisfatti direttamente dalla cache del browser, il che significa che le richieste originali per gli articoli sono state restituite con intestazioni che indicano che il browser potrebbe memorizzarle nella cache (ad esempio future Expireso Cache-Control: max-ageintestazioni), e che nel al momento dell'attivazione della nuova richiesta, quegli oggetti memorizzati nella cache erano ancora memorizzati nella cache locale e non erano ancora scaduti.

I 304, invece, sono la risposta del server dopo che il browser ha verificato se un file è stato modificato dall'ultima versione memorizzata nella cache (la risposta è "no").

Per prestazioni Web ottimali, è meglio impostare un futuro lontano Expires:o Cache-Control: max-ageun'intestazione per tutte le risorse, quindi quando è necessario modificare una risorsa, cambiare il nome file effettivo della risorsa o aggiungere una stringa di versione alle richieste per quella risorsa. Ciò elimina la necessità di effettuare qualsiasi richiesta a meno che l'asset non sia stato definitivamente modificato dalla versione nella cache (non è necessario per quella risposta 304). Google ha maggiori dettagli sull'uso corretto della memorizzazione nella cache a lungo termine .


2
Quindi, cosa c'è di meglio da una prospettiva di velocità ... "200 (cache)" o "304" messaggi di stato http?
Hank

22
200 cache. Alcune buone note a riguardo qui: developer.yahoo.com/performance/rules.html#expires . Desideri un tempo di scadenza il più lungo possibile sulle tue risorse, ma devi bilanciarlo con il fatto che perdi un certo controllo in questo modo. Una cosa che puoi fare è impostare scadenze di lunga durata sui file e, quando necessario, incrementare un numero di versione dell'asset per quei file. Ad esempio è possibile includere style.css? V1 e incrementare l'elemento <link> in style.css? V2 in caso di modifiche.
Ben Regenspan,

1
Giustizia, quindi perché Firebug segnala che per ga.js viene estratto dalla cache locale (stato = 200 cache) mentre combinati.min.js riporta uno stato di 304 http. La cosa strana è che entrambi i file sono dello stesso tipo (JavaScript) e risiedono nella stessa directory del server. Penseresti che entrambi sarebbero 200 o 304, e non diversi
Hank

8
Le intestazioni max-agee agecombinate possono anche dare come risultato 200 (cache) se ageè inferiore a max-age. L'unica eccezione è quando l'utente fa clic sul pulsante di aggiornamento del browser, nel qual caso viene inviata un'intestazione 304.
yitwail

2
HTML5 Boilerplate raccomanda di non utilizzare il metodo stringa di query di busting della cache - è meglio cambiare href, url,e srcriferimenti a ciascun file per includere un 'impronta digitale' (un hash del file o un semplice numero incrementato), e poi dire al server per togliere quell'impronta digitale e servire style.csso altro. Se non riesci a farlo sul server, chiedi al tuo sistema di compilazione di rinominare i file effettivi con l'impronta digitale.
iono il

62

200 (cache) significa che Firefox sta semplicemente usando la versione memorizzata nella cache locale. Questo è il più veloce perché non viene effettuata alcuna richiesta al server Web.

304 indica che Firefox sta inviando una richiesta condizionale "If-Modified-Since" al server Web. Se il file non è stato aggiornato dalla data di invio dal browser, il server Web restituisce una risposta 304 che in sostanza dice a Firefox di utilizzare la sua versione memorizzata nella cache. Non è veloce come 200 (cache) perché la richiesta viene comunque inviata al server Web, ma il server non deve inviare il contenuto del file.

Alla tua ultima domanda, non so perché i due file JavaScript nella stessa directory stiano restituendo risultati diversi.


18

Questo mi ha gettato anche per molto tempo. La prima cosa da verificare è che non ricarichi la pagina facendo clic sul pulsante di aggiornamento, che emetterà sempre una richiesta condizionale per le risorse e restituirà 304s per molti degli elementi della pagina. Invece vai nella barra dell'URL seleziona la pagina e premi invio come se avessi digitato di nuovo lo stesso URL, che ti darà un indicatore migliore di ciò che viene memorizzato nella cache correttamente. Questo articolo fa un ottimo lavoro spiegando la differenza tra richieste condizionate e incondizionate e in che modo il pulsante di aggiornamento le influenza: http://blogs.msdn.com/b/ieinternals/archive/2010/07/08/technical-information-about- condizionali-http-richieste-e-il-refresh-button.aspx


1
Non riesco nemmeno a descrivere quanto tempo ho trascorso cercando di capire lo stato 304 delle richieste alla CDN. Anche se rispondi a una domanda un po 'diversa, meriti una generosità :-)
Peeech,

Hai ragione: la differenza nei codici è legata al fatto che stai ricaricando o meno la stessa pagina. Se ricarico una pagina, vedo nel monitor di rete del browser un codice 304. Ma, se accedo a un altro URL, che utilizza questi stessi file, vedo nella rete del browser monitorare un codice 200 (dalla cache). Nel mio caso, l'altro URL era solo una stringa di query aggiunta all'URL originale (la pagina era essenzialmente lo stesso).
aldemarcalazans,

8

HTTP 304 è "non modificato". Il tuo server web in pratica dice al browser "questo file non è cambiato dall'ultima volta che lo hai richiesto." Considerando che un HTTP 200 sta dicendo al browser "qui è una risposta riuscita" - che dovrebbe essere restituito quando è la prima volta che il browser accede al file o la prima volta che si accede a una copia modificata.

Per maggiori informazioni sui codici di stato, consulta http://en.wikipedia.org/wiki/List_of_HTTP_status_codes .


Anche questa è la mia comprensione ... ed è per questo che nel mio post originale ho affermato che ho aggiornato la mia pagina più volte e sto ancora ricevendo i "200 (cache)" per lo stesso favicon.ico e JavaScript incluso che ho. Molto strano
Hank

2
200 in realtà non significa cache, significa solo OK. È probabile che la configurazione del tuo server non
indichi

Questo non è il caso b / c su alcuni dei miei JavaScript, ricevo un 304 e altri JavaScript ottengo un "200 (cache)". Tutto JavaScript risiede nella stessa directory del server web example.com/js/
Hank

Dovrei aggiungere che 200 (cache) significa solo che è localmente memorizzato nella cache e non sta effettivamente facendo una richiesta al server, che sarà più veloce che andare al server e ottenere una risposta 304.
richleland,

Ho aggiornato il mio post originale per mostrare il mio sito live e il JavaScript in questione. Si prega di consultare il mio post originale aggiornato.
Hank

2

Per la tua ultima domanda, perché? Proverò a spiegare con quello che so

Una breve spiegazione di questi tre codici di stato in parole povere.

  • 200 - successo (richieste del browser e recupero del file dal server)

Se la memorizzazione nella cache è abilitata nel server

  • 200 (dalla cache di memoria) - file trovato nel browser, quindi il browser non sta andando richiesta dal server
  • 304 - il browser richiede un file ma viene rifiutato dal server

Per alcuni file il browser sta decidendo di richiedere dal server e per alcuni sta decidendo di leggere dai file memorizzati (memorizzati nella cache). Perchè è questo ? Ogni file ha una data di scadenza, quindi

Se un file non è scaduto, il browser utilizzerà dalla cache (200 cache).

Se il file è scaduto, il browser richiede il server per un file. File di controllo del server in entrambi i punti (browser e server). Se viene trovato lo stesso file, il server rifiuta la richiesta. Come da protocollo, il browser utilizza un file esistente.

guarda questa configurazione di nginx

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

    ...
}

Qui la scadenza è impostata su 60 secondi, quindi tutti i file statici vengono memorizzati nella cache per 60 secondi. Quindi, se richiedi di nuovo un file entro 60 secondi, il browser leggerà dalla memoria (200 memorie). Se lo richiedi dopo 60 secondi, il browser richiederà il server (304).

Presumo che il file non venga modificato dopo 60 secondi, in tal caso si otterrebbero 200 (ovvero, il file aggiornato verrà recuperato dal server).

Pertanto, se i server sono configurati con diverse intestazioni (criteri) in scadenza e in cache, lo stato potrebbe essere diverso.

Nel tuo caso stai usando cdn, lo scopo principale di cdn è l'alta disponibilità e la consegna veloce. Pertanto utilizzano più server. Anche se sembra che i file si trovino nella stessa directory, cdn potrebbe utilizzare più server per fornire il contenuto, se tali server hanno configurazioni diverse. Quindi questi stati possono cambiare. Spero che sia d'aiuto.


304 - Not Modified non è un "rifiuto" da parte del server. È il server che dichiara al client "per la versione che stai chiedendo, so che non è stato modificato, non hai davvero bisogno del file". Tecnicamente, 304 è uno dei codici di risposta "reindirizzamento". Sta dicendo al client "prendilo dalla tua cache".
Bob Kuhar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.