¿Cuál es la diferencia entre Cache-Control: max-age=0 y no-cache?
El encabezado Cache-Control: max-age=0
implica que el contenido se considera obsoleto (y debe recuperarse) inmediatamente, lo que en realidad es lo mismo que Cache-Control: no-cache
.
Tenía la misma pregunta y encontré información en mis búsquedas (su pregunta apareció como uno de los resultados). Esto es lo que determiné...
El encabezado tiene dos lados Cache-Control
. Un lado es donde puede ser enviado por el servidor web (también conocido como "servidor de origen"). El otro lado es donde el navegador puede enviarlo (también conocido como "agente de usuario").
Cuando lo envía el servidor de origen
Creo que max-age=0
simplemente les dice a los cachés (y a los agentes de usuario) que la respuesta está obsoleta desde el principio y, por lo tanto, DEBEN revalidar la respuesta (por ejemplo, con el If-Not-Modified
encabezado) antes de usar una copia en caché, mientras que no-cache
les dice que DEBEN revalidar antes de usar una copia en caché. Copiar. Desde 14.9.1 ¿Qué se puede almacenar en caché ?
sin caché
...un caché NO DEBE utilizar 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.
En otras palabras, los cachés a veces pueden optar por usar una respuesta obsoleta (aunque creo que luego deben agregar un Warning
encabezado), pero no-cache
dicen que no pueden usar una respuesta obsoleta pase lo que pase. Tal vez desee el comportamiento DEBE revalidar cuando se generen estadísticas de béisbol en una página, pero querrá el comportamiento DEBE revalidar cuando haya generado la respuesta a una compra de comercio electrónico.
Aunque tiene razón en su comentario cuando dice que no-cache
no se supone que evite el almacenamiento, en realidad podría haber otra diferencia al usar no-cache
. Encontré una página, Directivas de control de caché desmitificadas , que dice (no puedo garantizar que sea correcta):
En la práctica, IE y Firefox han comenzado a tratar la directiva sin caché como si le indicara al navegador que ni siquiera almacene en caché la página. Comenzamos a observar este comportamiento hace aproximadamente un año. Sospechamos que este cambio fue provocado por el uso generalizado (e incorrecto) de esta directiva para evitar el almacenamiento en caché.
...
Observe que últimamente "cache-control: no-cache" también ha comenzado a comportarse como la directiva "no-store".
Aparte, me parece que Cache-Control: max-age=0, must-revalidate
básicamente debería significar lo mismo que Cache-Control: no-cache
. Entonces, ¿tal vez esa sea una forma de obtener el comportamiento DEBEno-cache
revalidar de , evitando al mismo tiempo la aparente migración de no-cache
hacer lo mismo que no-store
(es decir, sin almacenamiento en caché de ningún tipo)?
Cuando lo envía el agente de usuario
Creo que la respuesta de shahkalpesh se aplica al lado del agente de usuario. También puedes consultar 13.2.6 Desambiguación de respuestas múltiples .
Si un agente de usuario envía una solicitud con Cache-Control: max-age=0
(también conocido como "revalidación de un extremo a otro"), cada caché a lo largo del camino revalidará su entrada de caché (por ejemplo, con el If-Not-Modified
encabezado) hasta el servidor de origen. Si la respuesta es 304 (No modificado), se puede utilizar la entidad almacenada en caché.
Por otro lado, enviar una solicitud con Cache-Control: no-cache
(también conocido como "recarga de un extremo a otro") no se revalida y el servidor NO DEBE usar una copia en caché al responder.
edad máxima = 0
Esto equivale a hacer clic en Actualizar , lo que significa darme la última copia a menos que ya tenga la última copia.
sin caché
Esto es mantener presionada la tecla Mayús mientras haces clic en Actualizar, lo que significa que simplemente rehaces todo pase lo que pase.
Vieja pregunta ahora, pero si alguien más encuentra esto a través de una búsqueda como lo hice yo, parece que IE9 hará uso de esto para configurar el comportamiento de los recursos al usar los botones de avance y retroceso. Cuando se usa max-age=0 , el navegador usará la última versión al ver un recurso al presionar hacia atrás/adelante. Si no se utiliza caché, se recuperará el recurso.
Se pueden ver más detalles sobre el almacenamiento en caché de IE9 en esta publicación del blog sobre almacenamiento en caché de msdn .
En mis pruebas recientes con IE8 y Firefox 3.5, parece que ambos cumplen con RFC. Sin embargo, difieren en su "amistad" con el servidor de origen. IE8 trata no-cache
las respuestas con la misma semántica que max-age=0,must-revalidate
. Firefox 3.5, sin embargo, parece tratarse no-cache
como equivalente a no-store
, lo que apesta en términos de rendimiento y uso de ancho de banda.
Squid Cache, por defecto, parece nunca almacenar nada con un no-cache
encabezado, al igual que Firefox.
Mi consejo sería configurar public,max-age=0
recursos no confidenciales cuya actualización desee verificar en cada solicitud, pero aún así permitir los beneficios de rendimiento y ancho de banda del almacenamiento en caché. Para elementos por usuario con la misma consideración, utilice private,max-age=0
.
Yo evitaría el uso de no-cache
por completo, ya que parece que algunos navegadores y cachés populares lo han bastardeado hasta convertirlo en el equivalente funcional de no-store
.
Además, no emule a Akamai y Limelight. Si bien básicamente ejecutan matrices de almacenamiento en caché masivas como su negocio principal y deberían ser expertos, en realidad tienen un gran interés en provocar que se descarguen más datos de sus redes. Puede que Google tampoco sea una buena opción para la emulación. Parecen usarse max-age=0
o no-cache
aleatoriamente dependiendo del recurso.
edad máxima Cuando se fuerza una caché intermedia, mediante una directiva max-age=0, a revalidar su propia entrada de caché, y el cliente ha proporcionado su propio validador en la solicitud, el El validador proporcionado puede diferir del validador actualmente almacenado con la entrada de caché. En este caso, el caché PUEDE utilizar cualquiera de los validadores para realizar su propia solicitud sin afectando la transparencia semántica. Sin embargo, la elección del validador podría afectar el rendimiento. El mejor enfoque es para el caché intermedia para utilizar su propio validador al realizar su solicitud. Si el servidor responde con 304 (No modificado), entonces el caché puede devolver su copia ahora validada al cliente con una respuesta 200 (OK). Si el servidor responde con una nueva entidad y validador de caché, sin embargo, el caché intermedio puede comparar el validador devuelto con el proporcionado en la solicitud del cliente, utilizando la función de comparación fuerte. Si el validador del cliente es igual al del servidor de origen, entonces el caché intermedio simplemente devuelve 304 (no Modificado). De lo contrario, devuelve la nueva entidad con una respuesta 200 (OK). Si una solicitud incluye la directiva no-cache, NO DEBE incluir min-fresh, max-stale o max-age.
cortesía: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4
No acepte esto como respuesta; tendré que leerlo para comprender su verdadero uso :)