Perché questa risposta viene memorizzata nella cache?


32

Ho un client il cui indice.html del sito attualmente ritorna con queste intestazioni:

Accept-Ranges: byte
Connessione: Keep-Alive
Codifica del contenuto: gzip
Lunghezza contenuto: 3658
Tipo di contenuto: testo / html
Data: gio, 10 ott 2013 07:36:27 GMT
ETag: "4aa95e1-2ed2-4e721324728b7"
Keep-Alive: timeout = 5, max = 100
Ultima modifica: mar, 24 set 2013 13:34:30 GMT
Server: Apache / 2.2.22
Vary: Accept-Encoding, User-Agent

Sono ovviamente intenzione di raccomandare che aggiungono Expireso Cache-Controlse del caso, ma sono confuso: Chrome memorizza nella cache questa risorsa e l'usa dalla cache (non l'invio di una richiesta a tutti ), anche dopo diverse ore (per esempio, una copia riutilizzato è stato memorizzato nella cache ieri alle 13:30 di questa mattina alle 8:30). Posso vederlo abbastanza chiaramente nella scheda Rete della console di Chrome, dove mostra la richiesta ed è 200 (OK)in grigio nella colonna Stato e (from cache)nella colonna Dimensione . (Non ho modificato le impostazioni predefinite di memorizzazione nella cache di Chrome.)

Mi rendo conto che le specifiche consentono agli user agent di prendere le proprie decisioni in assenza di direzione dalle intestazioni. È quello che sta succedendo qui? Chrome vede che è stato modificato l'ultima volta diversi giorni fa e si sente libero di utilizzare una versione che (diciamo) non è aggiornata? O c'è qualcosa che mi manca?

Risposte:


33

Quando le intestazioni "Scadenza" e "Controllo cache" non vengono specificate, ma viene specificata un'intestazione "Ultima modifica" , i browser devono indovinare per quanto tempo devono conservare il documento nella cache. Alcuni browser fanno uso di algoritmi che permettono pagina rimangono nella cache per un giorno o più.

La guida alle best practice per la memorizzazione nella cache di Google afferma:

Last-Modified è un'intestazione di cache "debole" in quanto il browser applica un'euristica per determinare se recuperare l'elemento dalla cache o meno. (L'euristica è diversa tra i diversi browser.)


Mozilla (Firefox) ha una FAQ sulla cache HTTP che delinea il suo algoritmo per questa situazione (anche se è possibile che l'algoritmo sia cambiato da quando il documento è datato 2002):

... cerchiamo un'intestazione "Ultima modifica". Se questa intestazione è presente, la durata di aggiornamento della cache è uguale al valore dell'intestazione "Data" meno il valore dell'intestazione "Ultima modifica" divisa per 10.

Quindi, nel tuo caso in cui la differenza tra modificato e ora è di 15 giorni, Firefox memorizza nella cache la risorsa per 1,5 giorni.

Sembra che tutti i principali browser utilizzino la stessa regola del 10% implementata da Firefox. È stata posta una domanda su StackOveflow che richiede queste euristiche . Diverse risposte lì per diversi browser mostrano che tutti hanno implementazioni simili. Ci sono risposte per Internet Explorer e Webkit (Chrome e Safari).


La dimensione della cache del browser sarà probabilmente il fattore limitante per un file che l'algoritmo di cache determina può essere conservato per più di un giorno. I browser generalmente hanno un'impostazione per la quantità di spazio su disco che usano per la cache. Molti utenti cancellano anche la cache quando chiudono il browser. Quindi la quantità di tempo per cui un tale file viene memorizzato nella cache di solito dipende da:

  • La quantità di spazio cache allocata dal browser
  • Il numero di siti Web visitati da un utente (e le dimensioni di tali siti)
  • Se l'utente ha chiuso il browser o meno

Puoi chiarire "allora Firefox memorizzerebbe nella cache la risorsa per 1,5 giorni". Da quale data, memorizzerà nella cache fino a 1,5 giorni? Se sono già passati 15 giorni, sarebbe già scaduto, no? E dal momento che ORA meno l'ultima modifica sarà sempre crescente, vuoi dire, sarà memorizzata nella cache per sempre!
myDoggyWritesCode

1
Non per sempre. Per 1/10 del tempo tra l'ultima intestazione modificata e l'ora del download. Se sono trascorsi 15 giorni, ciò potrebbe significare che sono trascorsi 150 giorni dall'ultima modifica del file.
Stephen Ostermiller
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.