Pregunta ¿Cómo controlar el almacenamiento en caché de la página web en todos los navegadores?


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 se almacenen en caché. nunca, por el navegador web. Esto debe funcionar para al menos 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é.


1223
2017-09-08 12:08


origen


Respuestas:


Introducción

El conjunto mínimo correcto de encabezados que funciona en todos los clientes mencionados (y proxies):

Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0

los Cache-Control es según la especificación HTTP 1.1 para clientes y proxies (y implícitamente requerida por algunos clientes próximos a Expires) los Pragma es según la especificación HTTP 1.0 para clientes prehistóricos. los Expires es según las especificaciones HTTP 1.0 y 1.1 para clientes y proxies. En HTTP 1.1, el Cache-Control tiene prioridad sobre Expires, después de todo solo para los proxies HTTP 1.0.

Si no te importa IE6 y su almacenamiento en caché roto al publicar páginas a través de HTTPS con solo no-store, entonces podrías omitir Cache-Control: no-cache.

Cache-Control: no-store, must-revalidate
Pragma: no-cache
Expires: 0

Si no te importan los clientes IE6 ni HTTP 1.0 (HTTP 1.1 se introdujo en 1997), entonces podrías omitir Pragma.

Cache-Control: no-store, must-revalidate
Expires: 0

Si tampoco te importan los proxies HTTP 1.0, entonces podrías omitir Expires.

Cache-Control: no-store, must-revalidate

Por otro lado, si el servidor incluye automáticamente un válido Date encabezado, entonces teóricamente podrías omitir Cache-Control también y confía en Expires solamente.

Date: Wed, 24 Aug 2016 18:32:02 GMT
Expires: 0

Pero eso puede fallar si, por ejemplo, el usuario final manipula la fecha del sistema operativo y el software del cliente confía en él.

Otro Cache-Control parámetros tales como max-age son irrelevantes si lo mencionado anteriormente Cache-Control los parámetros están especificados los Last-Modified encabezado como se incluye en la mayoría de las otras respuestas aquí es solamente interesante si realmente quiero para almacenar en caché la solicitud, por lo que no necesita especificarla en absoluto.

¿Cómo configurarlo?

Usando PHP:

header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1.
header("Pragma: no-cache"); // HTTP 1.0.
header("Expires: 0"); // Proxies.

Usando Java Servlet o Node.js:

response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setHeader("Expires", "0"); // Proxies.

Usando ASP.NET-MVC

Response.Cache.SetCacheability(HttpCacheability.NoCache);  // HTTP 1.1.
Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.

Usando la API web de ASP.NET:

// `response` is an instance of System.Net.Http.HttpResponseMessage
response.Headers.CacheControl = new CacheControlHeaderValue
{
    NoCache = true,
    NoStore = true,
    MustRevalidate = true
};
response.Headers.Pragma.ParseAdd("no-cache");
// We can't use `response.Content.Headers.Expires` directly
// since it allows only `DateTimeOffset?` values.
response.Content?.Headers.TryAddWithoutValidation("Expires", 0.ToString()); 

Usando ASP.NET:

Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.

Usando ASP:

Response.addHeader "Cache-Control", "no-cache, no-store, must-revalidate" ' HTTP 1.1.
Response.addHeader "Pragma", "no-cache" ' HTTP 1.0.
Response.addHeader "Expires", "0" ' Proxies.

Usando Ruby on Rails, o Python / Flask:

response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
response.headers["Pragma"] = "no-cache" # HTTP 1.0.
response.headers["Expires"] = "0" # Proxies.

Usando Python / Django:

response["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
response["Pragma"] = "no-cache" # HTTP 1.0.
response["Expires"] = "0" # Proxies.

Usando Python / Pyramid:

request.response.headerlist.extend(
    (
        ('Cache-Control', 'no-cache, no-store, must-revalidate'),
        ('Pragma', 'no-cache'),
        ('Expires', '0')
    )
)

Usando Google Go:

responseWriter.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") // HTTP 1.1.
responseWriter.Header().Set("Pragma", "no-cache") // HTTP 1.0.
responseWriter.Header().Set("Expires", "0") // Proxies.

Usando Apache .htaccess archivo:

<IfModule mod_headers.c>
    Header set Cache-Control "no-cache, no-store, must-revalidate"
    Header set Pragma "no-cache"
    Header set Expires 0
</IfModule>

Usando HTML4:

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

Etiquetas meta HTML versus encabezados de respuesta HTTP

Es importante saber que cuando una página HTML se publica a través de una conexión HTTP, y un encabezado está presente en ambos los encabezados de respuesta HTTP y el HTML <meta http-equiv> etiquetas, entonces la especificada en el encabezado de respuesta HTTP tendrá precedencia sobre la metaetiqueta HTML. La metaetiqueta HTML solo se usará cuando la página se visualice desde el sistema de archivos del disco local a través de un file:// URL. Ver también W3 HTML spec capítulo 5.2.2. Tenga cuidado con esto cuando no los especifique programáticamente, porque el servidor web puede incluir algunos valores predeterminados.

En general, será mejor que solo no especifique las metaetiquetas HTML para evitar confusiones entre los principiantes y confíe en los encabezados de respuesta HTTP. Por otra parte, específicamente aquellos <meta http-equiv> las etiquetas son inválido en HTML5. Solo el http-equiv valores listados en Especificación de HTML5 están permitidos.

Verificación de los encabezados de respuesta HTTP reales

Para verificar el uno y el otro, puede verlos / depurarlos en el monitor de tráfico HTTP del conjunto de herramientas del desarrollador de webbrowser. Puedes acceder presionando F12 en Chrome / Firefox23 + / IE9 +, y luego abriendo el panel de la pestaña "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. los debajo de la captura de pantalla es de Chrome:

Chrome developer toolset HTTP traffic monitor showing HTTP response headers on stackoverflow.com

Quiero configurar esos encabezados en las descargas de archivos también

En primer lugar, esta pregunta y respuesta está dirigida a "páginas web" (páginas HTML), no a "descargas de archivos" (PDF, zip, Excel, etc.). Será mejor que los guardes en caché y utilices algún identificador de versión de archivo en algún lugar de la ruta URI o querystring para forzar una nueva descarga en un archivo modificado. Al aplicar esos encabezados sin caché en las descargas de archivos de todos modos, tenga cuidado con el error IE7 / 8 cuando se sirve una descarga de archivos a través de HTTPS en lugar de HTTP. Para detalles, ver 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.


2121
2018-03-30 23:08



(hey, todos: por favor no solo copien y peguen sin pensar todos los encabezados que puedan encontrar)

Ante todo, El historial del botón Atrás es no es un caché:

El modelo de frescura (Sección 4.2) no se aplica necesariamente a los mecanismos de historial. Es decir, un mecanismo de historial puede mostrar una representación previa incluso si ha expirado.

En la antigua especificación de HTTP, la redacción era aún más sólida, indicando explícitamente a los navegadores que ignorasen las directivas de caché para el historial del botón de retroceso.

Se supone que la parte posterior debe retroceder en el tiempo (hasta el momento en que el usuario estaba conectado). No avanza hacia una URL abierta previamente.

Sin embargo, en la práctica, la memoria caché puede influir en el botón Atrás, en circunstancias muy específicas:

  • Página debe ser entregado HTTPS, de lo contrario, esta eliminación de memoria caché no será confiable. Además, si no está usando HTTPS, su página es vulnerable al robo de inicios de sesión de muchas otras maneras.
  • Debes enviar Cache-Control: no-store, must-revalidate (algunos navegadores observan no-store y algunos observan must-revalidate)

Nunca necesita alguno de:

  • <meta> con encabezados de caché, no funciona en absoluto. Totalmente inútil.
  • post-check/pre-check - es una directiva solo de IE que solo se aplica a cachable recursos.
  • Enviando el mismo encabezado dos o doce partes. Algunos fragmentos de PHP realmente reemplazan a los encabezados anteriores, por lo que solo se envía el último.

Si lo desea, puede agregar:

  • no-cache o max-age=0, lo que hará que los recursos (URL) sean "obsoletos" y requieren navegadores para verificar con el servidor si hay una versión más nueva (no-storeya lo implica aún más fuerte).
  • Expires con una fecha en el pasado para clientes HTTP / 1.0 (aunque real Los clientes HTTP / 1.0-only son completamente inexistentes en estos días).

Prima: El nuevo HTTP caching RFC.


205
2017-08-29 16:50



Como dice porneL, lo que quiere es no desactivar la memoria caché, sino desactivar el búfer de historial. Los diferentes navegadores tienen sus propias formas sutiles de desactivar 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á:

  1. Cache-Control: no-store

  2. Cache-Control: no-cache (https solamente)

  3. Pragma: no-cache (https solamente)

  4. Vary: * (https solamente)

En Opera (v12.15) solo podemos hacer esto Cache-Control: must-revalidate (https solamente).

En Safari (v5.1.7, 7534.57.2), cualquiera de estos funcionará:

  1. Cache-Control: no-store
    <body onunload=""> en html

  2. Cache-Control: no-store (https solamente)

En IE8 (v8.0.6001.18702IC), cualquiera de estos funcionará:

  1. Cache-Control: must-revalidate, max-age=0

  2. Cache-Control: no-cache

  3. Cache-Control: no-store

  4. Cache-Control: must-revalidate
    Expires: 0

  5. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT

  6. Pragma: no-cache (https solamente)

  7. Vary: * (https solamente)

La combinación de lo anterior nos brinda 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 (https solamente)

Tenga en cuenta que https es necesario porque Opera no desactivará el búfer de historial para páginas http simples. Si realmente no puede obtener https y está dispuesto a ignorar a Opera, lo mejor que puede hacer es esto:

Cache-Control: no-store
<body onunload="">

A continuación se muestran los registros sin procesar de mis pruebas:

HTTP:

  1. 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="">
    Error: Opera 12.15
    Éxito: Chrome 28, FireFox 23, IE8, Safari 5.1.7

  2. 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="">
    Error: Opera 12.15
    Éxito: Chrome 28, FireFox 23, IE8, Safari 5.1.7

  3. 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

  4. 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

  5. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Error: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Éxito: IE8

  6. 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="">
    Error: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Éxito: IE8

  7. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Error: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Éxito: IE8

  8. 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="">
    Error: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Éxito: IE8

  9. Cache-Control: no-store
    Error: Safari 5.1.7, Opera 12.15
    Éxito: Chrome 28, FireFox 23, IE8

  10. Cache-Control: no-store
    <body onunload="">
    Error: Opera 12.15
    Éxito: Chrome 28, FireFox 23, IE8, Safari 5.1.7

  11. Cache-Control: no-cache
    Error: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Éxito: IE8

  12. Vary: *
    Error: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Éxito: ninguno

  13. Pragma: no-cache
    Error: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Éxito: ninguno

  14. 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="">
    Error: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Éxito: IE8

  15. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Error: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Éxito: IE8

  16. Cache-Control: must-revalidate, max-age=0
    Error: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Éxito: IE8

  17. Cache-Control: must-revalidate
    Expires: 0
    Error: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Éxito: IE8

  18. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Error: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Éxito: IE8

  19. Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Error: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Éxito: ninguno

HTTPS:

  1. Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    <body onunload="">
    Error: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Éxito: ninguno

  2. Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    <body onunload="">
    Error: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Éxito: ninguno

  3. Vary: *
    Error: Chrome 28, Safari 5.1.7, Opera 12.15
    Éxito: FireFox 23, IE8

  4. Pragma: no-cache
    Error: Chrome 28, Safari 5.1.7, Opera 12.15
    Éxito: FireFox 23, IE8

  5. Cache-Control: no-cache
    Error: Chrome 28, Safari 5.1.7, Opera 12.15
    Éxito: FireFox 23, IE8

  6. Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
    Error: Chrome 28, Safari 5.1.7, Opera 12.15
    Éxito: FireFox 23, IE8

  7. Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    Error: Chrome 28, Safari 5.1.7, Opera 12.15
    Éxito: FireFox 23, IE8

  8. 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: *
    Error: Chrome 28, Safari 5.1.7, Opera 12.15
    Éxito: FireFox 23, IE8

  9. Cache-Control: must-revalidate
    Error: Chrome 28, FireFox 23, IE8, Safari 5.1.7
    Éxito: Opera 12.15

  10. Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
    <body onunload="">
    Error: Chrome 28, FireFox 23, IE8, Safari 5.1.7
    Éxito: Opera 12.15

  11. Cache-Control: must-revalidate, max-age=0
    Error: Chrome 28, FireFox 23, Safari 5.1.7
    Éxito: IE8, Opera 12.15

  12. 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="">
    Error: Chrome 28, Safari 5.1.7
    Éxito: FireFox 23, IE8, Opera 12.15

  13. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Error: Chrome 28, Safari 5.1.7
    Éxito: FireFox 23, IE8, Opera 12.15

  14. Cache-Control: no-store
    Error: Opera 12.15
    Éxito: Chrome 28, FireFox 23, IE8, Safari 5.1.7

  15. Cache-Control: private, no-cache, no-store, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Error: Opera 12.15
    Éxito: Chrome 28, FireFox 23, IE8, Safari 5.1.7

  16. 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="">
    Error: Opera 12.15
    Éxito: Chrome 28, FireFox 23, IE8, Safari 5.1.7

  17. Cache-Control: private, no-cache
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    Error: Chrome 28, Safari 5.1.7, Opera 12.15
    Éxito: FireFox 23, IE8

  18. Cache-Control: must-revalidate
    Expires: 0
    Error: Chrome 28, FireFox 23, Safari 5.1.7,
    Éxito: IE8, Opera 12.15

  19. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Error: Chrome 28, FireFox 23, Safari 5.1.7,
    Éxito: IE8, Opera 12.15

  20. Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    <body onunload="">
    Error: Chrome 28, FireFox 23, Safari 5.1.7,
    Éxito: IE8, Opera 12.15

  21. Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    <body onunload="">
    Error: Chrome 28, FireFox 23, Safari 5.1.7,
    Éxito: IE8, Opera 12.15

  22. Cache-Control: private, must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    Error: Chrome 28, Safari 5.1.7
    Éxito: FireFox 23, IE8, Opera 12.15

  23. Cache-Control: no-store, must-revalidate
    Fallo: ninguno
    Éxito: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15


82
2018-06-15 02:40



Encontré útil la ruta web.config (intenté agregarla a la respuesta pero no parece que se haya aceptado, así que publique aquí)

<configuration>
<system.webServer>
    <httpProtocol>
        <customHeaders>
            <add name="Cache-Control" value="no-cache, no-store, must-revalidate" />
            <!-- HTTP 1.1. -->
            <add name="Pragma" value="no-cache" />
            <!-- HTTP 1.0. -->
            <add name="Expires" value="0" />
            <!-- Proxies. -->
        </customHeaders>
    </httpProtocol>
</system.webServer>

Y aquí está la forma express / node.js de hacer lo mismo:

app.use(function(req, res, next) {
    res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate');
    res.setHeader('Pragma', 'no-cache');
    res.setHeader('Expires', '0');
    next();
});

24
2018-01-14 23:35



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 utilizara una versión en caché de la página cuando la accedió al presionar el botón Atrás.

Después de mucha investigación y pruebas, descubrí que los únicos dos encabezados que realmente necesitaba eran:

Cache-Control: sin tienda
  Variar: *

Para obtener una explicación del encabezado Vary, echa un vistazo a 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 provocaron que la página se solicitara desde el servidor al hacer clic en un enlace a la página, o poner la URL directamente en la barra de direcciones. Eso cubre sobre 99% de todos los navegadores en uso a partir de enero de 2010.

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 otros navegadores que probé, buscaron una versión nueva del servidor. Hasta el momento, no he encontrado ningún conjunto de encabezados que provoquen que esos navegadores no devuelvan versiones en caché de las páginas al presionar el botón Atrás.

Actualizar:  Después de escribir esta respuesta, me di cuenta de que nuestro servidor web se identifica 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, mira BalusC's responder.


22
2017-09-08 12:11



Después de un poco de investigación, se nos ocurrió la siguiente lista de encabezados que parecía abarcar la mayoría de los navegadores:

En ASP.NET, agregamos estos usando el siguiente fragmento de código:

Response.ClearHeaders(); 
Response.AppendHeader("Cache-Control", "no-cache"); //HTTP 1.1
Response.AppendHeader("Cache-Control", "private"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "no-store"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "must-revalidate"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "max-stale=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "post-check=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "pre-check=0"); // HTTP 1.1 
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0 
Response.AppendHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT"); // HTTP 1.0 

Encontrado desde: http://forums.asp.net/t/1013531.aspx


18
2017-09-17 14:18



El uso del encabezado pragma en la respuesta es un cuento de mujeres. RFC2616 solo lo define como un encabezado de solicitud

http://www.mnot.net/cache_docs/#PRAGMA


8
2017-09-18 10:36



DESCARGO DE RESPONSABILIDAD: Recomiendo leer la respuesta de @ BalusC. Después de leer el siguiente tutorial de almacenamiento en caché: http://www.mnot.net/cache_docs/ (Recomiendo que lo leas también), 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 hice una pequeña investigación, encontré una pequeña variante, la probé y funcionó. Aquí está:

header('Cache-Control: no-store, private, no-cache, must-revalidate');     // HTTP/1.1
header('Cache-Control: pre-check=0, post-check=0, max-age=0, max-stale = 0', false);  // HTTP/1.1
header('Pragma: public');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');                  // Date in the past  
header('Expires: 0', false); 
header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT');
header ('Pragma: no-cache');

Eso debería funcionar. El problema era que al configurar la misma parte del encabezado dos veces, si el false no se envía como el segundo argumento de la función de encabezado, la función de encabezado simplemente sobrescribirá la anterior header() llamada. Por lo tanto, al configurar el Cache-Control, por ejemplo, si uno no quiere poner todos los argumentos en uno header() llamada de función, él debe hacer algo como esto:

header('Cache-Control: this');
header('Cache-Control: and, this', false);

Ver documentación más completa aquí.


7
2018-06-13 15:23



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 desactivar la compresión gzip para usuarios de IE6 (verifique el agente de usuario para "MSIE 6")


7
2017-09-08 12:14



El RFC para HTTP 1.1 dice que el método correcto es agregar un encabezado HTTP para:

Cache-Control: no-caché

Los navegadores más antiguos pueden ignorar esto si no cumplen adecuadamente con HTTP 1.1. Para aquellos que puedes probar el encabezado:

Pragma: no-caché

Esto también se supone que funciona para los navegadores HTTP 1.1.


6
2017-09-19 03:08