Diferencia entre no-cache y must-revalidate

179

Desde el RFC 2616

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

sin caché

Si la directiva sin caché no especifica un nombre de campo, entonces un caché NO DEBE usar la respuesta para satisfacer una solicitud posterior sin una revalidación exitosa con el servidor de origen. Esto permite que un servidor de origen evite el almacenamiento en caché incluso en cachés que se han configurado para devolver respuestas obsoletas a las solicitudes de los clientes.

Por lo tanto, indica a los agentes que revaliden todas las respuestas.

Comparado esto con

debe revalidar

Cuando la directiva must-revalidate está presente en una respuesta recibida por un caché, ese caché NO DEBE usar la entrada después de que se vuelva obsoleta para responder a una solicitud posterior sin primero revalidarla con el servidor de origen

Por lo tanto, indica a los agentes que revaliden las respuestas obsoletas .

Particularmente con respecto a no-cache, ¿es así como los agentes de usuario realmente tratan empíricamente esta directiva?

¿De qué sirve no-cachesi hay must-revalidatey max-age?

Ver este comentario:

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

sin caché

Aunque esta directiva parece indicarle al navegador que no guarde en caché la página, hay una sutil diferencia. La directiva "sin caché", según el RFC, le dice al navegador que debe revalidar con el servidor antes de servir la página desde el caché. La revalidación es una técnica ordenada que permite que la aplicación conserve el ancho de banda. Si la página que el navegador ha almacenado en caché no ha cambiado, el servidor solo se lo indica al navegador y la página se muestra desde la memoria caché. Por lo tanto, el navegador (en teoría, al menos) almacena la página en su caché, pero la muestra solo después de revalidar con el servidor. En la práctica, IE y Firefox han comenzado a tratar la directiva sin caché como si le indicara al navegador que ni siquiera guarde en caché la página. Comenzamos a observar este comportamiento hace aproximadamente un año.

¿Alguien tiene algo más oficial sobre esto?

Actualizar

La directiva debe revalidar debe ser utilizada por los servidores si y solo si la falta de validación de una solicitud en la representación puede resultar en una operación incorrecta, como una transacción financiera silenciosamente no ejecutada.

Eso es algo que nunca me había tomado en serio hasta ahora. El RFC dice que no se debe usar la revalidación a la ligera. La cuestión es que, con los servicios web, debe tener una visión negativa y asumir lo peor para sus aplicaciones de cliente desconocidas. Cualquier recurso obsoleto tiene el potencial de causar un problema.

Y algo más que acabo de considerar, sin Last-Modified o ETags, el navegador solo puede recuperar todo el recurso nuevamente. Sin embargo, con ETags, he observado que Chrome al menos parece revalidar en cada solicitud. Lo que hace que ambas directivas sean discutibles o al menos mal nombradas ya que no pueden revalidar adecuadamente a menos que la solicitud también incluya otros encabezados que luego causen 'revalidar siempre' de todos modos.

Solo quiero aclarar ese último punto. Simplemente configurando must-revalidatepero sin incluir un ETag o Last-Modified, el agente solo puede obtener el contenido nuevamente ya que no tiene nada que enviar al servidor para comparar.

Sin embargo, mis pruebas empíricas han demostrado que cuando se incluyen ETag o datos de encabezado modificado en las respuestas, los agentes siempre revalidan de todos modos, independientemente de la presencia del must-revalidateencabezado.

Por lo tanto, el punto must-revalidatees forzar una 'omisión de caché' cuando se vuelve obsoleta, lo que solo puede suceder cuando ha establecido una vida / edad, por lo tanto, si must-revalidatese configura en una respuesta sin edad u otros encabezados, se vuelve efectivamente equivalente a no-cachedesde la respuesta se considerará inmediatamente obsoleta.

- ¡Así que finalmente voy a marcar la respuesta de Gili!

Luke Puplett
fuente
Entonces, en teoría, la diferencia es validar-siempre vs validar-si-obsoleto , mientras que en la práctica ciertos navegadores tratan el no-caché ya que el comentario que citó dice que nunca-validar ... así que debe elegir cuál de ellos usar basado en el comportamiento de almacenamiento en caché que realmente quieres lograr en la práctica ...
CBroe
Lea greenbytes.de/tech/webdav/… y vea si esto aclara las cosas para usted.
Julian Reschke
consulte este árbol de decisión para obtener respuestas stackoverflow.com/a/49925190/3748498
pravdomil

Respuestas:

191

Creo que eso must-revalidatesignifica:

Una vez que la memoria caché caduca, rechace devolver respuestas obsoletas al usuario, incluso si dicen que las respuestas obsoletas son aceptables.

Mientras que no-cacheimplica:

must-revalidate más el hecho de que la respuesta se vuelve obsoleta de inmediato.

Si una respuesta se puede almacenar en caché durante 10 segundos, se must-revalidateactiva después de 10 segundos, mientras que no-cacheimplica must-revalidatedespués de 0 segundos.

Al menos, esa es mi interpretación.

Gili
fuente
2
Así es como lo estoy viendo ahora. La parte interesante es mi último párrafo, sin un ETag o Last-Modified, el agente no tiene nada que usar para validar lo que tiene en caché y debe descargar toda la carga útil nuevamente. Entonces, cuando el RFC dice "revalidar", eso probablemente significa volver a buscar.
Luke Puplett el
44
Lo que también significa max-age=0, must-revalidatey no-cacheson idénticos
Anshul
55
@Anshul, al principio pensé que tenías razón en que 'max-age = 0, must-revalidate y no-cache son idénticos', pero mira la respuesta de Jeffrey Fox que parece indicar que no es del todo correcto.
Don Hatch
2
@Anshul No, must-revalidatey no-cachetienen un significado diferente para nuevas respuestas: si una respuesta en caché es nueva (es decir, la respuesta no ha expirado), must-revalidatehará que el proxy lo sirva de inmediato sin revalidar con el servidor, mientras que con no-cacheel proxy debe revalidar el respuesta en caché independientemente de la frescura. Fuente: "HTTP - La guía definitiva", páginas 182-183.
Matthias Braun
8
@MatthiasBraun Ah, puedo ver la fuente de confusión. no-cachemax-age=0, must-revalidate
Tal vez
24

max-age=0, must-revalidatey no-cacheno son exactamente idénticos Con must-revalidate, si el servidor no responde a una solicitud de revalidación, se supone que el navegador / proxy devolverá un error 504. Con no-cache, solo mostraría el contenido almacenado en caché, que probablemente sería preferido por el usuario (mejor tener algo obsoleto que nada). Es por eso que must-revalidateestá destinado solo a transacciones críticas.

Jeffrey Fox
fuente
10
No estoy seguro de tu no-cacheinterpretación. Desde el RFC 7234 La directiva de respuesta "sin caché" indica que la respuesta NO DEBE usarse para satisfacer una solicitud posterior sin una validación exitosa en el servidor de origen. Esto permite que un servidor de origen evite que un caché lo use para satisfacer una solicitud sin contactarlo, incluso mediante cachés que se han configurado para enviar respuestas obsoletas. Esto suena similar a las restricciones paramust-revalidate
Anshul
9
¿Jeffrey tiene evidencia de que las implementaciones se comportan como lo ha descrito?
OrangeDog
Creo que esta respuesta es correcta para servidores proxy / lb. Pero, de hecho, los navegadores no devuelven un 504 en ese caso.
Yann Dìnendal
Eso must-validatesignificamust-refresh
Simon_Weaver
15

Con la interpretación de Jeffrey Fox sobre no-cache, he probado bajo Chrome 52.0.2743.116 m, el resultado muestra que no-cachetiene el mismo comportamiento que must-revalidate, todos ellos NO usarán caché local cuando el servidor no es accesible, y todos usarán caché mientras presionan la parte posterior del navegador / Botón de reenvío cuando el servidor no es accesible Como arriba, creo que max-age=0, must-revalidatees idéntico no-cache, al menos en la implementación.

Wilson Zeng
fuente
¿Chrome usará caché local cuando el servidor esté disponible para revalidar? (es decir, "Si se ha modificado desde"). ¿En ambos casos?
Rico
-2

Creo que hay una diferencia entre max-age=0, must-revalidatey no-cache:

En el must-revalidatecaso, el cliente puede enviar una If-Modified-Sincesolicitud y servir la respuesta de la memoria caché si 304 Not Modifiedse devuelve.

En el no-cachecaso, el cliente no debe almacenar en caché la respuesta, por lo que no debe usarla If-Modified-Since.

Rico
fuente
66
Pero no-cacheno significa que no-store, con no-cache, el recurso todavía se puede almacenar en caché en el cliente; solo debe ser revalidado antes de ser usado?
Aron
44
Estás fusionando no-cachey no-store. no-cachesignifica que el recurso DEBE ser revalidado . Revalidar incluye la opción de usar solicitudes condicionales, como If-None-Matchy If-Modified-Since.
Jules Sam. Randolph
1
@JulesRandolph: puede que tengas razón. ¿Tienes alguna prueba / demos? Todas las afirmaciones conflictivas libres de evidencia sobre este q son frustrantes. Incluso la respuesta aceptada solo dice "Al menos, esa es mi interpretación". Podría configurar un banco de pruebas y publicarlo aquí si tengo algo de tiempo.
Rico