Per rispondere alla tua domanda sul perché la memorizzazione nella cache funzioni, anche se il server Web non include le intestazioni:
- Scade:
[a date]
- Controllo cache: età massima =
[seconds]
Il server ha gentilmente chiesto a tutti i proxy intermedi di non memorizzare nella cache il contenuto (ovvero l'elemento deve essere memorizzato nella cache solo in una cache privata , ovvero solo sul proprio computer locale):
Ma il server ha dimenticato di includere qualsiasi tipo di suggerimenti per la memorizzazione nella cache:
- hanno dimenticato di includere Scadenza , quindi il browser sa di utilizzare la copia cache fino a tale data
- hanno dimenticato di includere Max-Age , quindi il browser sa per quanto tempo l'elemento nella cache è valido
- hanno dimenticato di includere l' E-Tag , quindi il browser può fare una richiesta condizionale
Ma hanno incluso una data dell'ultima modifica nella risposta:
Last-Modified: Tue, 16 Oct 2012 03:13:38 GMT
Poiché il browser conosce la data di modifica del file, può eseguire una richiesta condizionale . Chiederà al server il file, ma indicherà al server di inviare il file solo se è stato modificato dal 2012/10/16 3:13:38:
GET / HTTP/1.1
If-Modified-Since: Tue, 16 Oct 2012 03:13:38 GMT
Il server riceve la richiesta, si rende conto che il client ha già la versione più recente. Invece di inviare il client 200 OK
, seguito dal contenuto della pagina, invece ti dice che la tua versione cache è buona:
304 Not Modified
Il tuo browser ha dovuto subire il ritardo nell'invio di una richiesta al server e attendere una risposta, ma ha risparmiato di dover scaricare nuovamente il contenuto statico.
Perché Max-Age ? Perché scade ?
Perché l' ultima modifica fa schifo.
Non tutto sul server ha una data associata. Se sto costruendo una pagina al volo, non vi è alcuna data associata ad essa - è ora . Ma sono perfettamente disposto a lasciare all'utente la cache della home page per 15 secondi:
200 OK
Cache-Control: max-age=15
Se l'utente martella F5, continuerà a ottenere la versione cache per 15 secondi. Se si tratta di un proxy aziendale, tutti gli utenti 67198 che colpiscono la stessa pagina nella stessa finestra di 15 secondi riceveranno tutti gli stessi contenuti, tutti serviti da cache chiusa. Prestazioni vincenti per tutti.
La virtù dell'aggiunta Cache-Control: max-age
è che il browser non deve nemmeno eseguire una richiesta condizionale .
- se hai specificato solo
Last-Modified
, il browser deve eseguire una richiesta If-Modified-Since
e cercare una 304 Not Modified
risposta
- se specificato
max-age
, il browser non dovrà nemmeno subire il round-trip della rete; il contenuto verrà fuori dalla cache
La differenza tra "Cache-Control: max-age" e "Expires"
Expires
è un equivalente legacy dell'intestazione moderna (c. 1998) Cache-Control: max-age
:
Expires
: specifichi una data (schifo)
max-age
: specifichi i secondi (bontà)
E se vengono specificati entrambi , il browser utilizza max-age
:
200 OK
Cache-Control: max-age=60
Expires: 20180403T192837
Qualsiasi sito web scritto dopo il 1998 non dovrebbe Expires
più usare , e invece usare max-age
.
Che cos'è ETag?
ETag è simile a Last-Modified , tranne per il fatto che non deve essere una data, deve solo essere qualcosa .
Se sto estraendo un elenco di prodotti da un database, il server può inviare l'ultimo rowversion
come ETag, anziché come una data:
200 OK
ETag: "247986"
Il mio ETag può essere l'hash SHA1 di una risorsa statica (ad es. Immagine, js, css, font) o della pagina renderizzata nella cache (ovvero questo è ciò che fa il wiki MDN di Mozilla; hanno il markup finale):
200 OK
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
E esattamente come nel caso di una richiesta condizionale basata su Ultima modifica :
GET / HTTP/1.1
If-Modified-Since: Tue, 16 Oct 2012 03:13:38 GMT
304 Not Modified
Posso eseguire una richiesta condizionale basata su ETag:
GET / HTTP/1.1
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
304 Not Modified
An ETag
è superiore Last-Modified
perché funziona per cose oltre ai file o cose che hanno una nozione di data . E 'appena è