Che cos'è Cache-Control: privato?


148

Quando visito chesseng.herokuapp.com ricevo un'intestazione di risposta simile a

Cache-Control:private
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/css
Date:Tue, 16 Oct 2012 06:37:53 GMT
Last-Modified:Tue, 16 Oct 2012 03:13:38 GMT
Status:200 OK
transfer-encoding:chunked
Vary:Accept-Encoding
X-Rack-Cache:miss

e quindi aggiorno la pagina e ottengo

Cache-Control:private
Connection:keep-alive
Date:Tue, 16 Oct 2012 06:20:49 GMT
Status:304 Not Modified
X-Rack-Cache:miss

quindi sembra che la memorizzazione nella cache funzioni. Se funziona per la memorizzazione nella cache, qual è il punto di scadenza e controllo della cache: età massima . Per aggiungere confusione, quando provo la pagina su https://developers.google.com/speed/pagespeed/insights/ mi dice "Sfrutta il caching del browser".


controllare questo diagramma stackoverflow.com/a/49925190/3748498
pravdomil

Risposte:


74

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):

  • Controllo cache: privato

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-Sincee cercare una 304 Not Modifiedrisposta
  • 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 Expirespiù 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 rowversioncome 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-Modifiedperché funziona per cose oltre ai file o cose che hanno una nozione di data . E 'appena è


1
Eccezionale! Ho posto una taglia per questa risposta. Cosa succede se cache-controlnon esiste? E hai solo Etag? Non è ancora necessario effettuare una "richiesta condizionale" sul server? Il comportamento che vedo quando sono offline è che ritorna dalla cache. Ma quando è offline non può fare quella richiesta condizionale. Significa quindi se rimarrà nella cache indefinitamente se rimani offline? Ho già fatto questa domanda in dettaglio qui . Puoi dare un'occhiata?
Miele

167
Cache-Control: private

Indica che tutto o parte del messaggio di risposta è destinato a un singolo utente e NON DEVE essere memorizzato nella cache da una cache condivisa, come un server proxy.

Dalla sezione 14.9.1 di RFC2616


14
Perché è stato memorizzato nella cache dal tuo browser. Sei il singolo utente a cui era destinata la risposta.
Dan D.

13
No, non è Cache-Control:privatesolo perché afferma che le cache condivise (come le cache proxy) non devono memorizzare nella cache la risposta.
Dan D.

5
@Trejkaz No, significa davvero un singolo utente. Un utente è un account che ha una propria home directory in cui risiede la cache. I profili di proprietà dello stesso utente possono condividere la loro cache. Come hai trovato. Ma due profili sullo stesso computer se posseduti da utenti diversi non devono condividere la loro cache, a meno che quella cache non sia trattata come cache condivisa.
Dan

2
Ah, quindi è per utente a livello di sistema operativo. Sì, il motivo per cui mi chiedo è a causa di un'apparente perdita di informazioni tra le finestre in incognito di Chrome e quelle non in incognito, che utilizza la cache per farlo.
Trejkaz,

2
@didibus proxy-revalidaterichiede che i proxy siano sempre riconvalidati su ogni accesso. Dove as privateimpedisce al proxy di memorizzare nella cache.
Dan D.

20

RFC 2616, sezione 14.9.1 :

Indica che tutto o parte del messaggio di risposta è destinato a un singolo utente e NON DEVE essere memorizzato nella cache da una cache condivisa ... Una cache privata (non condivisa) PUO 'memorizzare nella cache la risposta.


I browser potrebbero utilizzare queste informazioni. Naturalmente, l'attuale "utente" può significare molte cose: utente del sistema operativo, un utente del browser (ad esempio i profili di Chrome), ecc. Non è specificato.

Per me, un esempio più concreto di Cache-Control: privateè che i server proxy (che in genere hanno molti utenti) non lo memorizzano nella cache. È pensato per l'utente finale e nessun altro.


Cordiali saluti, la RFC chiarisce che questo non fornisce sicurezza. Si tratta di mostrare il contenuto corretto, non di proteggere il contenuto.

Questo uso della parola privato controlla solo dove la risposta può essere memorizzata nella cache e non può garantire la privacy del contenuto del messaggio.


5
Una cache privata (non condivisa) PUO 'memorizzare nella cache la risposta. Questa parte è la chiave. Grazie.
Oliver,

0

Il campo Intestazione entità scaduta indica la data / ora dopo la quale la risposta è considerata non valida. Il campo Controllo cache: maxage fornisce il valore di età (in secondi) maggiore del quale la risposta è considerata obsoleta.

Sebbene sopra il campo dell'intestazione fornisca un meccanismo al client per decidere se inviare una richiesta al server. In alcune condizioni, il client invia una richiesta per recidere e il valore di età della risposta è maggiore del valore massimo, dose significa che il server deve inviare la risorsa al client? Forse la risorsa non è mai cambiata.

Per risolvere questo problema, HTTP1.1 fornisce un head modificato per ultimo. Il server fornisce al client l'ultima data modificata della risposta. Quando il client necessita di questa risorsa, invierà al server il campo head If-Modified-Since. Se questa data è precedente alla data modificata della risouce, il server invierà la risorsa al client e fornirà 200 codice, altrimenti restituirà 304 codice al client e questo significa che il client può utilizzare la risorsa memorizzata nella 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.