Come funziona esattamente "304 Not Modified"?


175
  • Come vengono generate le risposte "304 non modificate"?

  • In che modo un browser determina se la risposta a una richiesta HTTP è 304?

  • È impostato dal browser o inviato dal server?

  • Se inviato dal server, come fa il server a conoscere i dati disponibili nella cache, come imposta 304 su un'immagine?

Immagino, se è generato dal browser:

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());

Mi affido a un provider API di terze parti per ottenere dati, analizzarli e inviarli al mio database. I dati possono cambiare o meno durante ogni richiesta, ma l'intestazione viene sempre inviata 200. Non voglio analizzare, controllare l'ultimo ID univoco nel DB e così via ... per determinare la modifica dei dati, né confrontare il risultato direttamente piuttosto che io md5(), sha1()e ho crc32()eseguito il hash del risultato e funziona bene, ma mi chiedo del algoritmo da determinare 304.

Voglio utilizzare lo stesso tipo di algoritmo per determinare la modifica dei miei dati.


2
Sì, ho cercato su Google come funziona 304 non modificato , ma non ho ricevuto alcuna risposta.
VenomVendor

1
Devi essere un po 'più generale. google.com/search?q=http%20caching
SLaks

Risposte:


201

Quando il browser inserisce qualcosa nella sua cache, memorizza anche l' intestazione Last-Modifiedo ETagdal server.

Il browser invia quindi una richiesta con l' intestazione If-Modified-Sinceo If-None-Match, dicendo al server di inviare un 304 se il contenuto ha ancora quella data o ETag.

Il server ha bisogno di un modo per calcolare una data modificata o ETag per ogni versione di ogni risorsa; questo in genere proviene dal filesystem o da una colonna di database separata.


1
ETagè la parola chiave, selezionata con le intestazioni ETagrimane la stessa in entrambe Response Headers& Response Headers From Cache, puoi dire l'algoritmo dietro ETag. Ho aggiornato la mia domanda affermando il mio requisito.
VenomVendor

4
@VenomVendor: ETagè solo un campo in cui il server può memorizzare un ID univoco (in genere un hash o un numero di versione o un orologio vettoriale). Non ti aiuta a calcolare quell'ID; dipende dal tuo codice lato server.
SLaks

@SLaks: Cosa succede se la pagina ha una chiamata db ... C'è la possibilità che i dati nel db siano cambiati ... In questo caso non ha senso controllare l'ultima chiamata modificata, Corretto ?. Come viene esaminata questa condizione?
user1050619

3
@ user1050619: Spetta al tuo server assicurarsi che ETag sia preciso. Se mostri dati da un DB, devi includerli.
SLaks

Una cosa che non è ancora chiara è se se ne hai una grande max-ageallora il browser deve effettuare la richiesta? (poiché potrebbe stub nel 304 e non effettuare affatto la richiesta) ... vuoi questo ad esempio con risorse "impronte digitali" (sono buone per sempre). Altrimenti qual è il punto di max-age...
Andy Hayden

19

Ultima modifica: la data dell'ultima modifica per l'oggetto richiesto

If-Modified-Since: consente di restituire un 304 Not Modified se la data dell'ultima modifica è rimasta invariata.

ETag: un ETag è un identificatore opaco assegnato da un server Web a una versione specifica di una risorsa trovata in un URL. Se la rappresentazione della risorsa in quell'URL cambia, viene assegnato un ETag nuovo e diverso.

If-None-Match: consente di restituire un 304 non modificato se ETag è invariato.

la cache dell'archivio del browser con una data (ultima modifica) o id (ETag), quando è necessario richiedere nuovamente l'URL, il browser invia un messaggio di richiesta con l'intestazione:

inserisci qui la descrizione dell'immagine

il server restituirà 304 quando l'istruzione if è False e il browser utilizzerà la cache.

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.