Differenza tra no-cache e must-revalidate


179

Dall'RFC 2616

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1

no-cache

Se la direttiva no-cache non specifica un nome campo, una cache NON DEVE utilizzare la risposta per soddisfare una richiesta successiva senza riconvalida riuscita con il server di origine. Ciò consente a un server di origine di impedire la memorizzazione nella cache anche da cache configurate per restituire risposte non aggiornate alle richieste del client.

Quindi indirizza gli agenti a riconvalidare tutte le risposte.

Rispetto a

must-revalidate

Quando la direttiva must-revalidate è presente in una risposta ricevuta da una cache, quella cache NON DEVE utilizzare la voce dopo che è diventata obsoleta per rispondere a una richiesta successiva senza prima riconvalidarla con il server di origine

Quindi indirizza gli agenti a riconvalidare le risposte obsolete .

Soprattutto per quanto riguarda no-cache, è così che gli user agent trattano empiricamente questa direttiva?

Che senso ha no-cachese c'è must-revalidatee max-age?

Vedi questo commento:

http://palpapers.plynt.com/issues/2008Jul/cache-control-attributes/

no-cache

Anche se questa direttiva sembra indicare al browser di non memorizzare nella cache la pagina, c'è una sottile differenza. La direttiva "no-cache", secondo RFC, dice al browser che dovrebbe riconvalidarsi con il server prima di servire la pagina dalla cache. La riconvalida è una tecnica accurata che consente all'applicazione di conservare la larghezza di banda. Se la pagina memorizzata nella cache del browser non è cambiata, il server lo segnala al browser e la pagina viene visualizzata dalla cache. Quindi, il browser (almeno in teoria), memorizza la pagina nella sua cache, ma la visualizza solo dopo la riconvalida con il server. In pratica, IE e Firefox hanno iniziato a trattare la direttiva no-cache come se dicesse al browser di non memorizzare nemmeno nella cache la pagina. Abbiamo iniziato a osservare questo comportamento circa un anno fa.

Qualcuno ha qualcosa di più ufficiale su questo?

Aggiornare

La direttiva must-revalidate dovrebbe essere utilizzata dai server se e solo se la mancata convalida di una richiesta sulla rappresentazione potrebbe comportare un funzionamento errato, come una transazione finanziaria silenziosamente non eseguita.

È qualcosa che non ho mai preso a cuore fino ad ora. La RFC sta dicendo di non usare il leggero revalidare. Il fatto è che, con i servizi Web, devi avere una visione negativa e assumere il peggio per le tue app client sconosciute. Qualsiasi risorsa stantia ha il potenziale per causare un problema.

E qualcos'altro che ho appena preso in considerazione, senza Last-Modified o ETags, il browser può recuperare nuovamente l'intera risorsa. Tuttavia, con ETags, ho osservato che Chrome sembra almeno riconvalidare su ogni richiesta. Il che rende entrambe queste direttive discutibili o per lo meno mal nominate poiché non possono essere correttamente riconvalidate a meno che la richiesta non includa anche altre intestazioni che causano comunque "sempre riconvalidare" comunque.

Voglio solo chiarire quest'ultimo punto. Impostando must-revalidatema non includendo un ETag o Last-Modified, l'agente può ottenere di nuovo il contenuto solo perché non ha nulla da inviare al server per il confronto.

Tuttavia, i miei test empirici hanno dimostrato che quando ETag o i dati modificati dell'intestazione sono inclusi nelle risposte, gli agenti si riconvalidano sempre, indipendentemente dalla presenza must-revalidatedell'intestazione.

Quindi il punto di must-revalidateè forzare una 'cache di bypass' quando diventa stantio, il che può accadere solo quando hai impostato una vita / età, quindi se must-revalidateimpostato su una risposta senza età o altre intestazioni, diventa effettivamente equivalente a no-cacheda la risposta sarà considerata immediatamente stantia.

- Quindi segnerò finalmente la risposta di Gili!


Quindi in teoria la differenza è validate-always vs validate-if-stale , mentre in pratica la no-cache viene trattata da alcuni browser come il commento che hai citato dice come non validare ... quindi dovresti scegliere quale di quelli usare in base al comportamento di memorizzazione nella cache che si desidera effettivamente ottenere in pratica ...
CBroe

Si prega di leggere greenbytes.de/tech/webdav/… e vedere se questo chiarisce le cose per te.
Julian Reschke,


controllare questo albero decisionale per la risposta stackoverflow.com/a/49925190/3748498
pravdomil

Risposte:


191

Credo che ciò must-revalidatesignifichi:

Una volta scaduta la cache, rifiuta di restituire all'utente risposte non valide anche se si dice che le risposte non valide sono accettabili.

Considerando che no-cacheimplica:

must-revalidate più il fatto che la risposta diventa subito stantia.

Se una risposta è memorizzabile nella cache per 10 secondi, must-revalidateentra in gioco dopo 10 secondi, mentre no-cacheimplica che must-revalidatedopo 0 secondi.

Almeno, questa è la mia interpretazione.


2
È così che lo vedo ora. La parte interessante è il mio ultimo para, senza ETag o Last-Modified, l'agente non ha nulla da usare per convalidare ciò che ha nella cache e deve scaricare di nuovo l'intero payload. Quindi, quando la RFC dice "revalidate", ciò significa probabilmente, recuperare nuovamente.
Luke Puplett,

44
Il che significa anche max-age=0, must-revalidatee no-cachesono identici
Anshul

5
@Anshul, all'inizio pensavo che avessi ragione che 'max-age = 0, must-revalidate e no-cache sono identici', ma vedi la risposta di Jeffrey Fox che sembra indicare che non è del tutto giusto.
Don Hatch,

2
@Anshul No, must-revalidatee no-cachehanno un significato diverso per le nuove risposte: se una risposta memorizzata nella cache è nuova (ovvero, la risposta non è scaduta), must-revalidateil proxy lo servirà immediatamente senza riconvalidare con il server, mentre con no-cacheil proxy deve riconvalidare il risposta memorizzata nella cache indipendentemente dalla freschezza. Fonte: "HTTP - The Definitive Guide", pagine 182-183.
Matthias Braun,

8
@MatthiasBraun Ah, posso vedere la fonte di confusione. Forse dovrei aver scritto no-cachee max-age=0, must-revalidatesono identico
Anshul,

24

max-age=0, must-revalidatee no-cachenon sono esattamente identici. Con must-revalidate, se il server non risponde a una richiesta di riconvalida, il browser / proxy dovrebbe restituire un errore 504. Con no-cache, mostrerebbe solo il contenuto memorizzato nella cache, che sarebbe probabilmente preferito dall'utente (meglio avere qualcosa di stantio che niente). Questo è il motivo must-revalidateper cui è destinato solo a transazioni critiche.


10
Non sono sicuro della tua no-cacheinterpretazione. Dalla RFC 7234 La direttiva di risposta "no-cache" indica che la risposta NON DEVE essere utilizzata per soddisfare una richiesta successiva senza una valida convalida sul server di origine. Ciò consente a un server di origine di impedire a una cache di utilizzarlo per soddisfare una richiesta senza contattarla, anche mediante cache configurate per inviare risposte non aggiornate. Sembra simile alle restrizioni permust-revalidate
Anshul,

9
Jeffrey ha prove che le implementazioni si comportano come ha descritto?
OrangeDog,

Penso che questa risposta sia corretta per i server proxy / lb. Ma in effetti, i browser non restituiscono un 504 in quel caso.
Yann Dìnendal,

Quindi must-validatesignificamust-refresh
Simon_Weaver

15

Con l'interpretazione di Jeffrey Fox in merito no-cache, ho testato in Chrome 52.0.2743.116 m, il risultato mostra che no-cacheha lo stesso comportamento di must-revalidate, tutti NON useranno la cache locale quando il server è irraggiungibile e, tutti useranno la cache mentre toccano Indietro del browser / Pulsante Avanti quando il server non è raggiungibile. Come sopra, penso che max-age=0, must-revalidatesia identico a no-cache, almeno nell'attuazione.


Chrome utilizzerà la cache locale quando il server sarà disponibile per la riconvalida? (es. "If-Modified-Since"). In entrambi i casi?
Rich

-2

Penso che ci sia una differenza tra max-age=0, must-revalidatee no-cache:

Nel must-revalidatecaso in cui al client sia consentito inviare una If-Modified-Sincerichiesta e servire la risposta dalla cache se 304 Not Modifiedviene restituita.

Nel no-cachecaso, il client non deve memorizzare nella cache la risposta, quindi non dovrebbe usare If-Modified-Since.


6
Ma no-cachenon significa no-store- con no-cache, la risorsa può ancora essere memorizzata nella cache nel client; deve essere riconvalidato prima di essere utilizzato?
Aron,

4
Ti stai concentrando no-cachee no-store. no-cachesignifica che la risorsa DEVE essere riconvalidata . Revalidate include l'opzione per utilizzare richieste condizionali, come If-None-Matche If-Modified-Since.
Jules Sam. Randolph,

1
@JulesRandolph: potresti avere ragione. Hai qualche test / demo? Tutte le affermazioni contrastanti prive di prove su questa q sono frustranti. Anche la risposta accettata dice semplicemente "Almeno, questa è la mia interpretazione". Potrei creare un banco di prova e pubblicarlo qui se avrò del tempo.
Rich
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.