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-Controles por la especificación HTTP 1.1 para clientes y proxies (y es requerido implícitamente por algunos clientes al ladoExpires) ElPragmaes por la especificación HTTP 1.0 para clientes prehistóricos. ElExpireses según las especificaciones HTTP 1.0 y 1.1 para clientes y proxies. En HTTP 1.1,Cache-Controlprevalece 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
Dateencabezado válido , teóricamenteCache-Controltambién podría omitirlo y confiarExpiressolo 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-Controlparámetros comomax-ageson irrelevantes siCache-Controlse especifican los parámetros mencionados anteriormente . ElLast-Modifiedencabezado 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
.htaccessarchivo 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-equivvalores 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-storey 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-cacheomax-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-storeya implica que esto es aún más fuerte).Expirescon 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-cacheya queno-cacheya implicamust-revalidate? w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1no-cacheconmust-revalidatees verdadera para el caché, pero el historial anterior no es un caché. Navegadores de casos especiales explícitosmust-revalidatepara 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-storeCache-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=0Cache-Control: no-cacheCache-Control: no-storeCache-Control: must-revalidateExpires: 0Cache-Control: must-revalidateExpires: Sat, 12 Oct 1991 05:00:00 GMTPragma: 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=0Expires: 0Pragma: no-cacheVary: *<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=0Expires: Sat, 12 Oct 1991 05:00:00 GMTPragma: no-cacheVary: *<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=0Expires: 0Pragma: no-cacheVary: *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=0Expires: Sat, 12 Oct 1991 05:00:00 GMTPragma: no-cacheVary: *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=0Expires: 0Pragma: no-cacheVary: *<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=0Expires: Sat, 12 Oct 1991 05:00:00 GMTPragma: no-cacheVary: *<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=0Expires: 0Pragma: no-cacheVary: *<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=0Expires: Sat, 12 Oct 1991 05:00:00 GMTPragma: no-cacheVary: *<body onunload="">Falla: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Éxito: IE8
Cache-Control: no-storeError: 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-cacheFalla: 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-cacheFallo: 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=0Expires: Sat, 12 Oct 1991 05:00:00 GMTPragma: no-cacheVary: *<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=0Expires: 0Pragma: no-cacheVary: *<body onunload="">Falla: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Éxito: IE8
Cache-Control: must-revalidate, max-age=0Falla: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Éxito: IE8
Cache-Control: must-revalidateExpires: 0Falla: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Éxito: IE8
Cache-Control: must-revalidateExpires: Sat, 12 Oct 1991 05:00:00 GMTFalla: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Éxito: IE8
Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0Pragma: no-cacheVary: *<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=0Expires: 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=0Expires: 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-cacheFallo: Chrome 28, Safari 5.1.7, Opera 12.15
Éxito: FireFox 23, IE8
Cache-Control: no-cacheFallo: 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=0Fallo: 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=0Expires: 0Pragma: no-cacheVary: *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=0Expires: Sat, 12 Oct 1991 05:00:00 GMTPragma: no-cacheVary: *Fallo: Chrome 28, Safari 5.1.7, Opera 12.15
Éxito: FireFox 23, IE8
Cache-Control: must-revalidateFallo: 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=0Fallo: 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=0Expires: Sat, 12 Oct 1991 05:00:00 GMTPragma: no-cacheVary: *<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=0Expires: 0Pragma: no-cacheVary: *<body onunload="">Falla: Chrome 28, Safari 5.1.7
Éxito: FireFox 23, IE8, Opera 12.15
Cache-Control: no-storeFallo: 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=0Expires: 0Pragma: no-cacheVary: *<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=0Expires: Sat, 12 Oct 1991 05:00:00 GMTPragma: no-cacheVary: *<body onunload="">Fallo: Opera 12.15
Éxito: Chrome 28, FireFox 23, IE8, Safari 5.1.7
Cache-Control: private, no-cacheExpires: Sat, 12 Oct 1991 05:00:00 GMTPragma: no-cacheVary: *Fallo: Chrome 28, Safari 5.1.7, Opera 12.15
Éxito: FireFox 23, IE8
Cache-Control: must-revalidateExpires: 0Falla: Chrome 28, FireFox 23, Safari 5.1.7,
Éxito: IE8, Opera 12.15
Cache-Control: must-revalidateExpires: Sat, 12 Oct 1991 05:00:00 GMTFalla: 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=0Expires: 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=0Expires: 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-revalidateExpires: Sat, 12 Oct 1991 05:00:00 GMTPragma: no-cacheVary: *Falla: Chrome 28, Safari 5.1.7
Éxito: FireFox 23, IE8, Opera 12.15
Cache-Control: no-store, must-revalidateFallo: 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-storeharí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.confes: es la configuración principal y el archivo de configuración para unaASP.NETaplicació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-cacheyCache-Control: privatechoque: 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
falseno 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.csAsegú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-controlenno-cache, y la segunda línea agrega los otros atributosno-store, must-revalidatefuente
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
ExpiresDefaulten su.htaccessarchivo si usted está utilizando para permitir que el almacenamiento en caché.Luego, puede usar
ExpiresByTypepara 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.headerllamadas web.py. Redacté mi código de utilidad personal irrelevante a propósito.importar web sistema de importación importar UTILIDADES PERSONALES myname = "main.py" urls = ( '/', 'clase principal' ) main = web.application (urls, globals ()) render = web.template.render ("plantillas /", base = "diseño", caché = Falso) clase main_class (objeto): def GET (auto): web.header ("Cache-control", "no-cache, no-store, must-revalidate") web.header ("Pragma", "sin caché") web.header ("Caduca", "0") volver render.main_form () POST def (auto): msg = "PUBLICADO:" form = web.input (function = None) web.header ("Cache-control", "no-cache, no-store, must-revalidate") web.header ("Pragma", "sin caché") web.header ("Caduca", "0") return render.index_laid_out (saludo = msg + form.function) if __name__ == "__main__": nargs = len (sys.argv) # Asegúrese de que haya suficientes argumentos después del nombre del programa python si nargs! = 2: LOG-AND-DIE ("% s: error de línea de comando, nargs =% s, debe ser 2", myname, nargs) # Asegúrese de que el número de puerto TCP sea numérico tratar: tcp_port = int (sys.argv [1]) excepto Excepción como e: LOG-AND-DIE ("% s: tcp_port = int (% s) falló (no es un entero)", myname, sys.argv [1]) # ¡Todo está bien! JUST-LOG ("% s: ejecutándose en el puerto% d", myname, tcp_port) web.httpserver.runsimple (main.wsgifunc (), ("localhost", tcp_port)) main.run ()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-storefunciona 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