Nuestras investigaciones nos han demostrado que no todos los navegadores respetan las directivas de caché HTTP de manera uniforme.
Por razones de seguridad, no queremos que ciertas páginas de nuestra aplicación sean almacenadas en caché, nunca, por el navegador web. Esto debe funcionar al menos para los siguientes navegadores:
- Internet Explorer 6+
- Firefox 1.5+
- Safari 3+
- Opera 9+
- Cromo
Nuestro requisito vino de una prueba de seguridad. Después de cerrar sesión en nuestro sitio web, puede presionar el botón Atrás y ver las páginas en caché.
http
caching
https
http-headers
Edward Wilde
fuente
fuente
Respuestas:
Introducción
El conjunto mínimo correcto de encabezados que funciona en todos los clientes mencionados (y servidores proxy):
El
Cache-Control
es por la especificación HTTP 1.1 para clientes y proxies (y es requerido implícitamente por algunos clientes al ladoExpires
) ElPragma
es por la especificación HTTP 1.0 para clientes prehistóricos. ElExpires
es según las especificaciones HTTP 1.0 y 1.1 para clientes y proxies. En HTTP 1.1,Cache-Control
prevalece sobreExpires
, por lo que es, después de todo, solo para proxies HTTP 1.0.Si no le importa IE6 y su almacenamiento en caché roto cuando solo sirve páginas a través de HTTPS
no-store
, puede omitirloCache-Control: no-cache
.Si no le interesan los clientes IE6 ni HTTP 1.0 (HTTP 1.1 se introdujo en 1997), puede omitirlo
Pragma
.Si tampoco te interesan los proxys HTTP 1.0, entonces puedes omitirlos
Expires
.Por otro lado, si el servidor incluye automáticamente un
Date
encabezado válido , teóricamenteCache-Control
también podría omitirlo y confiarExpires
solo en él.Pero eso puede fallar si, por ejemplo, el usuario final manipula la fecha del sistema operativo y el software del cliente depende de ella.
Otros
Cache-Control
parámetros comomax-age
son irrelevantes siCache-Control
se especifican los parámetros mencionados anteriormente . ElLast-Modified
encabezado como se incluye en la mayoría de las otras respuestas aquí solo es interesante si realmente desea almacenar en caché la solicitud, por lo que no necesita especificarla en absoluto.¿Cómo configurarlo?
Usando PHP:
Usando Java Servlet, o Node.js:
Usando ASP.NET-MVC
Usando ASP.NET Web API:
Usando ASP.NET:
Usando ASP.NET Core v3
Usando ASP:
Usando Ruby on Rails, o Python / Flask:
Usando Python / Django:
Usando Python / Pyramid:
Usando Go:
Usando el
.htaccess
archivo Apache :Usando HTML4:
Metaetiquetas HTML frente a encabezados de respuesta HTTP
Es importante saber que cuando se sirve una página HTML a través de una conexión HTTP, y un encabezado está presente tanto en los encabezados de respuesta HTTP como en las
<meta http-equiv>
etiquetas HTML , entonces el especificado en el encabezado de respuesta HTTP tendrá prioridad sobre la metaetiqueta HTML. La metaetiqueta HTML solo se utilizará cuando la página se vea desde un sistema de archivos de disco local a través de unafile://
URL. Ver también W3 HTML spec capítulo 5.2.2 . Tenga cuidado con esto cuando no los especifique mediante programación porque el servidor web puede incluir algunos valores predeterminados.En general, es mejor que no especifique las metaetiquetas HTML para evitar confusiones por parte de los principiantes y confiar en los encabezados de respuesta HTTP. Además, específicamente esas
<meta http-equiv>
etiquetas no son válidas en HTML5. Solo se permiten loshttp-equiv
valores enumerados en la especificación HTML5 .Verificación de los encabezados de respuesta HTTP reales
Para verificar uno y otro, puede verlos / depurarlos en el monitor de tráfico HTTP del conjunto de herramientas de desarrollo del navegador web. Puede llegar presionando F12 en Chrome / Firefox23 + / IE9 + y luego abriendo el panel de pestañas "Red" o "Red", y luego haciendo clic en la solicitud HTTP de interés para descubrir todos los detalles sobre la solicitud y respuesta HTTP. La siguiente captura de pantalla es de Chrome:
También quiero configurar esos encabezados en las descargas de archivos
En primer lugar, esta pregunta y respuesta están dirigidas a "páginas web" (páginas HTML), no a "descargas de archivos" (PDF, zip, Excel, etc.). Será mejor que los guarde en caché y utilice algún identificador de versión de archivo en algún lugar de la ruta URI o cadena de consulta para forzar una descarga en un archivo modificado. Cuando aplique esos encabezados sin caché en las descargas de archivos de todos modos, tenga cuidado con el error IE7 / 8 al realizar una descarga de archivos a través de HTTPS en lugar de HTTP. Para más detalles, consulte IE no puede descargar foo.jsf. IE no pudo abrir este sitio de Internet. El sitio solicitado no está disponible o no se puede encontrar .
fuente
(Hola, todos: por favor, no solo copie y pegue sin pensar todos los encabezados que pueda encontrar)
En primer lugar, el historial del botón Atrás no es un caché :
En la antigua especificación HTTP, la redacción era aún más fuerte, indicando explícitamente a los navegadores que ignoraran las directivas de caché para el historial del botón de retroceso.
Atrás se supone que retroceder en el tiempo (hasta el momento en que el usuario se registra en). No navega hacia adelante a una URL abierta previamente.
Sin embargo, en la práctica, el caché puede influir en el botón Atrás, en circunstancias muy específicas:
Cache-Control: no-store, must-revalidate
(algunos navegadores observanno-store
y otros observanmust-revalidate
)Usted no necesita ninguna de:
<meta>
con encabezados de caché: no funciona en absoluto. Totalmente inútil.post-check
/pre-check
- es la directiva solo de IE que solo se aplica a los recursos en caché .Si lo desea, puede agregar:
no-cache
omax-age=0
, lo que hará que el recurso (URL) "caduque" y requiera que los navegadores verifiquen con el servidor si hay una versión más nueva (no-store
ya implica que esto es aún más fuerte).Expires
con una fecha en el pasado para clientes HTTP / 1.0 (aunque los clientes reales solo HTTP / 1.0 son completamente inexistentes en estos días).Bonificación: El nuevo almacenamiento en caché HTTP RFC .
fuente
Cache-Control: must-revalidate
. ¿Por qué no enviarCache-Control: no-cache
ya queno-cache
ya implicamust-revalidate
? w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1no-cache
conmust-revalidate
es verdadera para el caché, pero el historial anterior no es un caché. Navegadores de casos especiales explícitosmust-revalidate
para controlar el comportamiento del historial .Como dijo @Kornel, lo que quiere no es desactivar el caché, sino desactivar el búfer de historial. Los diferentes navegadores tienen sus propias formas sutiles de deshabilitar el búfer de historial.
En Chrome (v28.0.1500.95 m) podemos hacer esto solo por
Cache-Control: no-store
.En Firefox (v23.0.1) cualquiera de estos funcionará:
Cache-Control: no-store
Cache-Control: no-cache
(solo https)Pragma: no-cache
(solo https)Vary: *
(solo https)En Opera (v12.15) solo podemos hacer esto
Cache-Control: must-revalidate
(solo https).En Safari (v5.1.7, 7534.57.2) cualquiera de estos funcionará:
Cache-Control: no-store
<body onunload="">
en htmlCache-Control: no-store
(solo https)En IE8 (v8.0.6001.18702IC) cualquiera de estos funcionará:
Cache-Control: must-revalidate, max-age=0
Cache-Control: no-cache
Cache-Control: no-store
Cache-Control: must-revalidate
Expires: 0
Cache-Control: must-revalidate
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
(solo https)Vary: *
(solo https)La combinación de lo anterior nos da esta solución que funciona para Chrome 28, FireFox 23, IE8, Safari 5.1.7 y Opera 12.15:
Cache-Control: no-store, must-revalidate
(solo https)Tenga en cuenta que https es necesario porque Opera no desactivaría el búfer de historial para páginas http simples. Si realmente no puede obtener https y está preparado para ignorar Opera, lo mejor que puede hacer es esto:
A continuación se muestran los registros sin procesar de mis pruebas:
HTTP:
Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
Fallo: Opera 12.15
Éxito: Chrome 28, FireFox 23, IE8, Safari 5.1.7
Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
<body onunload="">
Fallo: Opera 12.15
Éxito: Chrome 28, FireFox 23, IE8, Safari 5.1.7
Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
Error: Safari 5.1.7, Opera 12.15
Éxito: Chrome 28, FireFox 23, IE8
Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
Error: Safari 5.1.7, Opera 12.15
Éxito: Chrome 28, FireFox 23, IE8
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
Falla: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Éxito: IE8
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
<body onunload="">
Falla: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Éxito: IE8
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
Falla: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Éxito: IE8
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
<body onunload="">
Falla: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Éxito: IE8
Cache-Control: no-store
Error: Safari 5.1.7, Opera 12.15
Éxito: Chrome 28, FireFox 23, IE8
Cache-Control: no-store
<body onunload="">
Fallo: Opera 12.15
Éxito: Chrome 28, FireFox 23, IE8, Safari 5.1.7
Cache-Control: no-cache
Falla: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Éxito: IE8
Vary: *
Fallo: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
Éxito: ninguno
Pragma: no-cache
Fallo: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
Éxito: ninguno
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
<body onunload="">
Falla: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Éxito: IE8
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
Falla: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Éxito: IE8
Cache-Control: must-revalidate, max-age=0
Falla: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Éxito: IE8
Cache-Control: must-revalidate
Expires: 0
Falla: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Éxito: IE8
Cache-Control: must-revalidate
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Falla: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Éxito: IE8
Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
Pragma: no-cache
Vary: *
<body onunload="">
Fallo: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
Éxito: ninguno
HTTPS:
Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
<body onunload="">
Fallo: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
Éxito: ninguno
Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
<body onunload="">
Fallo: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
Éxito: ninguno
Vary: *
Fallo: Chrome 28, Safari 5.1.7, Opera 12.15
Éxito: FireFox 23, IE8
Pragma: no-cache
Fallo: Chrome 28, Safari 5.1.7, Opera 12.15
Éxito: FireFox 23, IE8
Cache-Control: no-cache
Fallo: Chrome 28, Safari 5.1.7, Opera 12.15
Éxito: FireFox 23, IE8
Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
Fallo: Chrome 28, Safari 5.1.7, Opera 12.15
Éxito: FireFox 23, IE8
Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
Fallo: Chrome 28, Safari 5.1.7, Opera 12.15
Éxito: FireFox 23, IE8
Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
Fallo: Chrome 28, Safari 5.1.7, Opera 12.15
Éxito: FireFox 23, IE8
Cache-Control: must-revalidate
Fallo: Chrome 28, FireFox 23, IE8, Safari 5.1.7
Éxito: Opera 12.15
Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
<body onunload="">
Fallo: Chrome 28, FireFox 23, IE8, Safari 5.1.7
Éxito: Opera 12.15
Cache-Control: must-revalidate, max-age=0
Fallo: Chrome 28, FireFox 23, Safari 5.1.7
Éxito: IE8, Opera 12.15
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
<body onunload="">
Falla: Chrome 28, Safari 5.1.7
Éxito: FireFox 23, IE8, Opera 12.15
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
Falla: Chrome 28, Safari 5.1.7
Éxito: FireFox 23, IE8, Opera 12.15
Cache-Control: no-store
Fallo: Opera 12.15
Éxito: Chrome 28, FireFox 23, IE8, Safari 5.1.7
Cache-Control: private, no-cache, no-store, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
Fallo: Opera 12.15
Éxito: Chrome 28, FireFox 23, IE8, Safari 5.1.7
Cache-Control: private, no-cache, no-store, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
<body onunload="">
Fallo: Opera 12.15
Éxito: Chrome 28, FireFox 23, IE8, Safari 5.1.7
Cache-Control: private, no-cache
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
Fallo: Chrome 28, Safari 5.1.7, Opera 12.15
Éxito: FireFox 23, IE8
Cache-Control: must-revalidate
Expires: 0
Falla: Chrome 28, FireFox 23, Safari 5.1.7,
Éxito: IE8, Opera 12.15
Cache-Control: must-revalidate
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Falla: Chrome 28, FireFox 23, Safari 5.1.7,
Éxito: IE8, Opera 12.15
Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
<body onunload="">
Falla: Chrome 28, FireFox 23, Safari 5.1.7,
Éxito: IE8, Opera 12.15
Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
<body onunload="">
Falla: Chrome 28, FireFox 23, Safari 5.1.7,
Éxito: IE8, Opera 12.15
Cache-Control: private, must-revalidate
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
Falla: Chrome 28, Safari 5.1.7
Éxito: FireFox 23, IE8, Opera 12.15
Cache-Control: no-store, must-revalidate
Fallo: ninguno
Éxito: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
fuente
<body onunload="">
pero parece más una forma de evitar el problema real. He intentado usar .htaccess y modificar los encabezados de esa manera, si uso HTTPS ¿debería funcionar de esa manera? Principalmente es el safari donde más se presenta el problema.Cache-Control: no-store
haría el truco.<body onunload="">
solo es necesario cuando no tienes HTTPS.Encontré la ruta web.config útil (traté de agregarla a la respuesta pero no parece haber sido aceptada, por lo que publico aquí)
Y aquí está la forma express / node.js de hacer lo mismo:
fuente
web.conf
es: es la configuración principal y el archivo de configuración para unaASP.NET
aplicación web. Es un documento XML que reside en el directorio raíz. ( wiki ).Descubrí que todas las respuestas en esta página todavía tenían problemas. En particular, noté que ninguno de ellos evitaría que IE8 usara una versión en caché de la página cuando accediera presionando el botón Atrás.
Después de mucha investigación y pruebas, descubrí que los únicos dos encabezados que realmente necesitaba eran:
Para obtener una explicación del encabezado Vary, consulte http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.6
En IE6-8, FF1.5-3.5, Chrome 2-3, Safari 4 y Opera 9-10, estos encabezados hicieron que se solicitara la página del servidor cuando hace clic en un enlace a la página o coloca la URL directamente en la barra de direcciones. Eso cubre aproximadamente el 99% de todos los navegadores en uso a partir de enero '10.
En IE6 y Opera 9-10, al presionar el botón Atrás todavía se cargaba la versión en caché. En todos los demás navegadores que probé, obtuvieron una versión nueva del servidor. Hasta ahora, no he encontrado ningún conjunto de encabezados que haga que esos navegadores no devuelvan versiones en caché de las páginas cuando presionas el botón Atrás.
Actualización: Después de escribir esta respuesta, me di cuenta de que nuestro servidor web se identifica a sí mismo como un servidor HTTP 1.0. Los encabezados que he enumerado son los correctos para que los navegadores no almacenen en caché las respuestas de un servidor HTTP 1.0. Para un servidor HTTP 1.1, mire la respuesta de BalusC .
fuente
Después de un poco de investigación, se nos ocurrió la siguiente lista de encabezados que parecían cubrir la mayoría de los navegadores:
En ASP.NET los agregamos usando el siguiente fragmento:
Encontrado en: http://forums.asp.net/t/1013531.aspx
fuente
Cache-Control: no-cache
yCache-Control: private
choque: nunca debes unir ambos: el primero le dice a los navegadores y proxies que no se almacenen en caché, el segundo le dice a los proxies que no se almacenen en caché, pero permite que los navegadores tengan su propia copia privada. No estoy seguro de qué configuración seguirá el navegador, pero es poco probable que sea coherente entre los navegadores y las versiones.El uso del encabezado pragma en la respuesta es un cuento de esposas. RFC2616 solo lo define como un encabezado de solicitud
http://www.mnot.net/cache_docs/#PRAGMA
fuente
DESCARGO DE RESPONSABILIDAD: le recomiendo leer la respuesta de @ BalusC. Después de leer el siguiente tutorial de almacenamiento en caché: http://www.mnot.net/cache_docs/ (le recomiendo que también lo lea), creo que es correcto. Sin embargo, por razones históricas (y porque lo he probado yo mismo), incluiré mi respuesta original a continuación:
Intenté la respuesta 'aceptada' para PHP, que no funcionó para mí. Luego investigué un poco, encontré una ligera variante, la probé y funcionó. Aquí está:
Eso debería funcionar. El problema era que al configurar la misma parte del encabezado dos veces, si
false
no se envía como segundo argumento a la función de encabezado, la función de encabezado simplemente sobrescribirá laheader()
llamada anterior . Entonces, al configurarCache-Control
, por ejemplo, si uno no quiere poner todos los argumentos en unaheader()
llamada de función, debe hacer algo como esto:Ver documentación más completa aquí .
fuente
Para ASP.NET Core, cree una clase de middleware simple:
luego regístralo con
Startup.cs
Asegúrese de agregar esto en algún lugar después
fuente
Estas directivas no mitigan ningún riesgo de seguridad. Realmente están destinados a obligar a los UA a actualizar la información volátil, no a evitar que los UA retengan información. Ver esta pregunta similar . Por lo menos, no hay garantía de que ningún enrutador, proxy, etc. ignore las directivas de almacenamiento en caché.
En una nota más positiva, las políticas relacionadas con el acceso físico a las computadoras, la instalación de software y similares lo pondrán millas por delante de la mayoría de las empresas en términos de seguridad. Si los consumidores de esta información son miembros del público, lo único que realmente puede hacer es ayudarlos a comprender que una vez que la información llega a su máquina, esa máquina es su responsabilidad, no la suya.
fuente
Hay un error en IE6
El contenido con "Content-Encoding: gzip" siempre se almacena en caché, incluso si usa "Cache-Control: no-cache".
http://support.microsoft.com/kb/321722
Puede deshabilitar la compresión gzip para usuarios de IE6 (verifique el agente de usuario para "MSIE 6")
fuente
El RFC para HTTP 1.1 dice que el método adecuado es agregar un encabezado HTTP para:
Control de caché: sin caché
Los navegadores más antiguos pueden ignorar esto si no cumplen correctamente con HTTP 1.1. Para aquellos que pueden probar el encabezado:
Pragma: sin caché
También se supone que esto funciona para los navegadores HTTP 1.1.
fuente
Establecer el encabezado http modificado en alguna fecha en 1995 generalmente hace el truco.
Aquí hay un ejemplo:
fuente
La documentación de PHP para la función de encabezado tiene un ejemplo bastante completo (aportado por un tercero):
fuente
Si tiene problemas de descarga con IE6-IE8 sobre SSL y caché: encabezado sin caché (y valores similares) con archivos de MS Office, puede usar caché: privado, encabezado sin almacenamiento y archivo de retorno en la solicitud POST. Funciona.
fuente
en mi caso solucioné el problema en Chrome con esto
donde necesito borrar el contenido de los datos de un formulario anterior cuando los usuarios vuelven a presionar el botón por razones de seguridad
fuente
La respuesta aceptada no parece funcionar para IIS7 +, pasando por la gran cantidad de preguntas sobre los encabezados de caché que no se envían en II7:
Y así
La respuesta aceptada es correcta en qué encabezados deben establecerse, pero no en cómo deben establecerse. De esta manera funciona con IIS7:
La primera línea se establece
Cache-control
enno-cache
, y la segunda línea agrega los otros atributosno-store, must-revalidate
fuente
Response.Cache.SetAllowResponseInBrowserHistory(false); Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.Cache.SetNoStore(); Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
He tenido los mejores y más consistentes resultados en todos los navegadores configurando Pragma: no-cache
fuente
Los encabezados en la respuesta proporcionada por BalusC no evitan que Safari 5 (y posiblemente también versiones anteriores) muestren contenido de la memoria caché del navegador cuando se usa el botón Atrás del navegador. Una forma de evitar esto es agregar un atributo de controlador de eventos onunload vacío a la etiqueta del cuerpo:
Este truco aparentemente rompe la memoria caché hacia atrás en Safari: ¿hay un evento de carga entre navegadores al hacer clic en el botón Atrás?
fuente
Además, sólo por si acaso, asegúrese de restablecer el
ExpiresDefault
en su.htaccess
archivo si usted está utilizando para permitir que el almacenamiento en caché.Luego, puede usar
ExpiresByType
para establecer valores específicos para los archivos que desea almacenar en caché:Esto también puede ser útil si el navegador almacena en caché sus archivos dinámicos, como php, etc., y no puede entender por qué. Compruebe
ExpiresDefault
.fuente
Además de los encabezados, considere publicar su página a través de https . Muchos navegadores no almacenarán en caché https de forma predeterminada.
fuente
fuente
Para completar BalusC -> RESPUESTA Si está usando perl, puede usar CGI para agregar encabezados HTTP.
Usando Perl:
Usando apache httpd.conf
Nota: cuando traté de usar el html META, los navegadores los ignoraron y almacenaron en caché la página.
fuente
Solo quiero señalar que si alguien quiere evitar el almacenamiento en caché SOLO de contenido dinámico, agregar esos encabezados adicionales debe hacerse mediante programación.
Edité el archivo de configuración de mi proyecto para agregar encabezados sin caché, pero eso también deshabilitó el contenido estático de almacenamiento en caché, que generalmente no es deseable. La modificación de los encabezados de respuesta en el código garantiza que las imágenes y los archivos de estilo se almacenen en caché.
Esto es bastante obvio, pero aún vale la pena mencionarlo.
Y otra precaución. Tenga cuidado al usar el método ClearHeaders de la clase HttpResponse. Puede causar algunos moretones si lo usa imprudentemente. Al igual que me dio.
Después de redirigir en el evento ActionFilterAttribute, las consecuencias de borrar todos los encabezados están perdiendo todos los datos de sesión y datos en el almacenamiento TempData. Es más seguro redireccionar desde una Acción o no borrar los encabezados cuando se realiza la redirección.
Pensándolo bien, desaliento a todos a usar el método ClearHeaders. Es mejor eliminar los encabezados por separado. Y para configurar el encabezado Cache-Control correctamente, estoy usando este código:
fuente
No tuve suerte con los
<head><meta>
elementos. Agregar parámetros relacionados con la caché HTTP directamente (fuera del documento HTML) realmente funciona para mí.A continuación se muestra un código de muestra en Python usando
web.header
llamadas web.py. Redacté mi código de utilidad personal irrelevante a propósito.fuente
Vea este enlace a un Estudio de caso sobre el almacenamiento en caché:
http://securityevaluators.com/knowledge/case_studies/caching/
Resumen, según el artículo, solo
Cache-Control: no-store
funciona en Chrome, Firefox e IE. IE acepta otros controles, pero Chrome y Firefox no. El enlace es una buena lectura completa con el historial de almacenamiento en caché y documentación de prueba de concepto.fuente
No estoy seguro de si mi respuesta suena simple y estúpida, y tal vez ya lo ha sabido desde hace mucho tiempo, pero como evitar que alguien use el botón de retroceso del navegador para ver sus páginas históricas es uno de sus objetivos, puede usar:
window.location.replace("https://www.example.com/page-not-to-be-viewed-in-browser-history-back-button.html");
Por supuesto, es posible que esto no se pueda implementar en todo el sitio, pero al menos para algunas páginas críticas, puede hacerlo. Espero que esto ayude.
fuente
puede usar el bloqueo de ubicación para establecer un archivo individual en lugar de que la aplicación completa almacene en caché en IIS
fuente