Pregunta

Nuestras investigaciones nos han demostrado que no todos los navegadores respecto a la caché de http directivas de una manera uniforme.

Por razones de seguridad, no queremos que ciertas páginas de nuestra aplicación se almacena en caché, nunca, por el navegador web.Esta debe trabajar para, al menos, los siguientes navegadores:

  • Internet Explorer 6+
  • Firefox 1.5+
  • Safari 3+
  • Opera 9+
  • Chrome

Nuestro requisito de vino de una prueba de seguridad.Después de la sesión en nuestro sitio web, usted puede pulsar el botón atrás y ver las páginas en caché.

¿Fue útil?

Solución

Introducción

La correcta conjunto mínimo de encabezados que funciona a través de todos los mencionados clientes (y proxy):

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

El Cache-Control es por el HTTP 1.1 especificaciones de los clientes y los servidores proxy (e implícitamente, por parte de algunos clientes junto a Expires).El Pragma es por el HTTP 1.0 de la especificación de las prehistóricos clientes.El Expires es por el HTTP 1.0 y 1.1 de la especificación de los clientes y los servidores proxy.En HTTP 1.1, la Cache-Control tiene prioridad sobre Expires, así que después de todo para HTTP 1.0 proxies sólo.

Si usted no se preocupan por IE6 y sus roto el almacenamiento en caché la hora de servir las páginas a través de HTTPS con sólo no-store, entonces se podría omitir Cache-Control: no-cache.

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

Si usted no se preocupan por IE6 ni HTTP 1.0 clientes (HTTP 1.1 se introdujo 1997), se puede omitir Pragma.

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

Si no se preocupan acerca de HTTP 1.0 proxies bien, entonces usted podría omitir Expires.

Cache-Control: no-store, must-revalidate

Por otro lado, si el servidor de auto-incluye una válida Date encabezado, entonces teóricamente podría omitir Cache-Control demasiado y se basan en Expires sólo.

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

Pero que puede fallar si, por ejemplo,el usuario final manipula la fecha del sistema operativo y el software de cliente de confiar en ella.

Otros Cache-Control parámetros tales como max-age es irrelevante si el citado Cache-Control los parámetros se especifican.El Last-Modified encabezado, tal como se incluye en la mayoría de las otras respuestas es sólo muy interesante, si en realidad quieren la caché de la solicitud, por lo que no es necesario especificar en absoluto.

Cómo establecer?

El uso de PHP:

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

El uso de 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.

El uso de 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.

El uso de ASP.NET API Web:

// `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()); 

El uso de 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.

El uso de 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/Frasco:

headers["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
headers["Pragma"] = "no-cache" # HTTP 1.0.
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/Pirámide:

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

El Uso De Ir:

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.

El Uso De 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>

El uso de 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 de HTML vs encabezados de respuesta HTTP

Importante es saber que cuando una página HTML se sirve a través de una conexión HTTP, y un encabezado está presente en ambos los encabezados de respuesta HTTP y HTML <meta http-equiv> etiquetas, a continuación, la especificada en el encabezado de respuesta HTTP obtendrá prioridad sobre la etiqueta meta HTML.La etiqueta meta HTML sólo se utiliza cuando la página se visualiza desde un disco local del sistema de archivos a través de un file:// Dirección URL.Ver también W3 HTML spec capítulo 5.2.2.Tener cuidado con esto cuando no se especifica mediante programación, debido a que el servidor web puede es decir, se incluyen algunos valores por defecto.

Generalmente, sería mejor que sólo no especificar en las etiquetas meta para evitar la confusión por empezar, y dependen de duro encabezados de respuesta HTTP.Por otra parte, específicamente aquellos <meta http-equiv> etiquetas no válido en HTML5.Sólo el http-equiv los valores indicados en Especificación de HTML5 están permitidos.

La verificación de la real encabezados de respuesta HTTP

Para verificar el uno y el otro, puede ver/depurar en el tráfico HTTP monitor de webbrowser desarrolladores un conjunto de herramientas.Puedes llegar presionando F12 en Chrome/Firefox23+/IE9+, y luego de la apertura de la "Red" o "Red" de la ficha del panel y, a continuación, hacer clic en la solicitud HTTP de interés para descubrir todos los detalles acerca de la solicitud y respuesta HTTP.El la siguiente captura de pantalla es de Chrome:

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

Quiero establecer los encabezados en las descargas de archivos también

Primero de todo, esta pregunta y la respuesta se orienta a la "web pages" (páginas HTML), no de "descarga de archivos" (PDF, zip, Excel, etc).Es mejor que tenerlos en caché y hacer uso de algunos de archivo del identificador de la versión en algún lugar en la URI de la ruta de acceso o querystring para forzar una descarga en un archivo modificado.Cuando la aplicación de los encabezados no-cache de descargas de archivos de todos modos, entonces cuidado con el IE7/8 error a la hora de servir la descarga de un archivo a través de HTTPS en lugar de HTTP.Para más detalle, véase Es decir no se puede descargar foo.jsf.Es decir, no era capaz de abrir este sitio de internet.La página solicitada no está disponible o no puede ser encontrado.

Otros consejos

(hey, todo el mundo:por favor, no sólo sin copiar y pegar todos los encabezados usted puede encontrar)

Primero de todo, Botón atrás de la historia es no caché:

La frescura del modelo (Sección 4.2) no se aplica necesariamente a la historia de los mecanismos.Es decir, una historia de mecanismo puede mostrar una previa representación incluso si ha caducado.

En el antiguo HTTP especificación de la redacción fue aún más fuerte, diciendo explícitamente que los navegadores caso omiso de directivas de caché para el botón atrás de la historia.

De nuevo se supone que debe ir atrás en el tiempo (el tiempo cuando el usuario fue conectado).No navegar hacia un abierto anteriormente URL.

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 a través de HTTPS, que , de lo contrario esta caché no ser fiable.Además, si no estás usando HTTPS, su página es vulnerable a la de inicio de sesión de robar en muchas otras maneras.
  • Usted debe enviar Cache-Control: no-store, must-revalidate (algunos navegadores observar no-store y algunos observar must-revalidate)

Usted nunca necesita alguno de los siguientes:

  • <meta> con los encabezados de caché — no funciona en absoluto.Totalmente inútil.
  • post-check/pre-check — es IE-sólo directiva que sólo se aplica a cacheable con recursos.
  • El envío de un mismo encabezado o dos veces en la docena de piezas.Algunos fragmentos de código PHP lo reemplace los encabezados anteriores, lo que sólo el último enviado.

Si lo desea, puede añadir:

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

Bono: La nueva caché de HTTP RFC.

Como porneL dicho, lo que quiero es que no para desactivar la caché, pero para desactivar el búfer de historial.Los diferentes navegadores tienen sus propias maneras sutiles para deshabilitar el búfer de historial.

En Chrome (v28.0.1500.95 m) esto solo se puede realizar por Cache-Control: no-store.

En FireFox (v23.0.1) cualquiera de estos trabajos:

  1. Cache-Control: no-store

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

  3. Pragma: no-cache (https solamente)

  4. Vary: * (https solamente)

En la Ópera (v12.15) sólo podemos hacer esto por Cache-Control: must-revalidate (https solamente).

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

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

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

En IE8 (v8.0.6001.18702 IC) de cualquiera de estos trabajos:

  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 los de arriba nos da esta solución que funciona para Chrome 28, FireFox 23, 8, Safari 5.1.7, y Opera 12.15: Cache-Control: no-store, must-revalidate (https solamente)

Tenga en cuenta que https es necesario porque la Ópera no desactivar el búfer de historial de llanura http páginas.Si usted realmente no puede conseguir https y usted está preparado para ignorar la Ópera, lo mejor que puedes hacer es esto:

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

A continuación se muestra los registros 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, 8, 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, 8, 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, 8, 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, 8, Safari 5.1.7, Opera 12.15
    Éxito:ninguno

  13. Pragma: no-cache
    Error:Chrome 28, FireFox 23, 8, 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, 8, 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, 8, 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, 8, 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, 8, 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, 8, 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:8, 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, 8, 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, 8, Opera 12.15

  14. Cache-Control: no-store
    Error:Opera 12.15
    Éxito:Chrome 28, FireFox 23, 8, 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, 8, 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, 8, 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:8, 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:8, 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:8, 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:8, 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, 8, Opera 12.15

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

He encontrado la web.config ruta útil (trató de agregar a la respuesta, pero no parece haber sido aceptada para publicar 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á el express / node.js forma de hacer la misma:

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();
});

Descubrí que todas las respuestas en esta página aún tenía problemas.En particular, me di cuenta de que ninguno de ellos deje de IE8 desde el uso de una versión en caché de la página cuando se accede a él pulsando el botón atrás.

Después de mucha investigación y pruebas, he encontrado que las dos únicas cabeceras realmente necesitaba eran:

Cache-Control:sin almacén
Variar:*

Para una explicación de Variar el encabezado, echa un vistazo http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.6

En IE6-8, FF1.5-3.5, Chrome 2-3, Safari 4, y la Ópera 9-10, estos encabezados causado la página para ser solicitado por el servidor cuando el usuario haga clic en un enlace a la página, o poner la URL directamente en la barra de direcciones.Que cubre alrededor de 99% de todos los navegadores en uso como de Ene '10.

En IE6, y la Ópera 9-10, golpear el botón de nuevo todavía causado la versión en caché para ser cargado.En todos los demás navegadores que he probado, lo hicieron buscar una nueva versión del servidor.Hasta ahora, no he encontrado ninguna conjunto de encabezados que hará que los navegadores para no volver versiones en caché de las páginas cuando se pulsa 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.Las cabeceras que he enumerado son los correctos en el orden de las respuestas de un servidor HTTP 1.0 a no ser en caché de los navegadores.Para un servidor de HTTP 1.1, mira BalusC del respuesta.

Después de un poco de investigación nos planteamos la siguiente lista de encabezados que parecía cubrir la mayoría de los navegadores:

En ASP.NET hemos añadido estas 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 

Encontrar a partir de: http://forums.asp.net/t/1013531.aspx

El uso de la pragma encabezado en la respuesta es un cuento de las esposas.RFC2616 sólo la define como un encabezado de solicitud

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

DESCARGO de responsabilidad:Yo sugiero la lectura de @BalusC la respuesta.Después de la lectura de los siguientes almacenamiento en caché tutorial: http://www.mnot.net/cache_docs/ (Te recomiendo que la lean), yo creo que es correcto.Sin embargo, por razones históricas (y porque lo he probado yo mismo), lo voy a incluir mi respuesta original a continuación:


He probado el de "aceptado" respuesta de PHP, la cual no funcionó para mí.Luego hice un poco de investigación, se encontró una ligera 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');

Que deben trabajar.El problema fue que cuando la configuración de la misma parte de la cabecera dos veces, si el false no es enviado como segundo argumento para el encabezado de la función, el encabezado de la función simplemente sobrescribe la anterior header() de la llamada.Así, al establecer la Cache-Control, por ejemplo, si uno no quiere poner todos los argumentos en uno header() llamada a la función, él debe hacer algo como esto:

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

Consulte la documentación más completa aquí.

Hay un error en el IE6

Contenido con "Content-Encoding:gzip" está siempre en caché incluso si el uso de "Cache-Control:no-cache".

http://support.microsoft.com/kb/321722

Puede deshabilitar la compresión gzip para IE6 a los usuarios (consulte el agente de usuario para "MSIE 6")

Para ASP.NET Core, crear un simple middleware de la clase:

public class NoCacheMiddleware
{
    private readonly RequestDelegate m_next;

    public NoCacheMiddleware( RequestDelegate next )
    {
        m_next = next;
    }

    public async Task Invoke( HttpContext httpContext )
    {
        httpContext.Response.OnStarting( ( state ) =>
        {
            // ref: http://stackoverflow.com/questions/49547/making-sure-a-web-page-is-not-cached-across-all-browsers
            httpContext.Response.Headers.Append( "Cache-Control", "no-cache, no-store, must-revalidate" );
            httpContext.Response.Headers.Append( "Pragma", "no-cache" );
            httpContext.Response.Headers.Append( "Expires", "0" );
            return Task.FromResult( 0 );
        }, null );

        await m_next.Invoke( httpContext );
    }
}

registre, con Startup.cs

app.UseMiddleware<NoCacheMiddleware>();

Asegúrese de agregar esta en algún lugar después de

app.UseStaticFiles();

El RFC para HTTP 1.1 dice que el método adecuado es agregar un Encabezado HTTP para:

Cache-Control:no-cache

Los navegadores más antiguos pueden ignorar esto si no son adecuadamente compatible con HTTP 1.1.Para los que se puede tratar el encabezado:

Pragma:no-cache

Esto también supone que el trabajo de HTTP 1.1 de los navegadores.

Estas directivas no mitigar cualquier riesgo para la seguridad.Ellos son realmente la intención de forzar la UA para la actualización de información volátil, no mantener UA de la retención de la información.Ver esta pregunta similar.Al menos, no hay ninguna garantía de que cualquier enrutadores, servidores proxy, etc.no ignorar el almacenamiento en caché de las directivas, así.

En una nota más positiva, las políticas sobre el acceso físico a los equipos, instalación de software, y el como va a poner a kilómetros de distancia de la mayoría de las empresas en términos de seguridad.Si los consumidores de esta información son los miembros del público, lo único que podemos hacer es ayudarles a entender que una vez que la información éxitos de su máquina, la máquina es su la responsabilidad, no la tuya.

Configuración de la modificación de la cabecera http para alguna fecha en 1995 se hace el truco.

He aquí un ejemplo:

Expires: Wed, 15 Nov 1995 04:58:08 GMT
Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
Cache-Control: no-cache, must-revalidate

El Documentación de PHP para el encabezado de la función tiene más bien un ejemplo completo (aportado por un tercero):

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

Si usted está enfrentando problemas de descarga con IE6-IE8 a través de SSL y de la caché:no-cache (y valores similares) con archivos de MS Office puede utilizar caché:privada,no de la tienda de cabecera y devolver el archivo en la petición POST.Funciona.

en mi caso puedo solucionar el problema en chrome con este

<form id="form1" runat="server" autocomplete="off">

donde tengo que borrar el contenido de una anterior los datos del formulario cuando el usuario haga clic en el botón de nuevo por razones de seguridad

He tenido mejores y más consistentes resultados en todos los navegadores mediante el establecimiento de Pragma:no-cache

Los encabezados de la respuesta proporcionada por BalusC no impide que Safari 5 (y posiblemente las versiones anteriores, así como de mostrar el contenido de la caché del navegador cuando se utiliza el botón atrás del navegador.Una manera de evitar esto es para agregar un vacío evento onunload controlador de atributo a la etiqueta body:

<body onunload=""> 

Este hack aparentemente se rompe la parte de atrás-adelante caché de Safari: Hay un cross-browser evento onload al hacer clic en el botón atrás?

El aceptó la respuesta no parece trabajo para IIS7+, pasando por el gran número de preguntas acerca de los encabezados de caché no se envían en II7:

Y así sucesivamente

El aceptó respuesta es correcta en la que los encabezados deben ser definidas, pero no en la forma en que se deben establecer.De esta manera trabaja con IIS7:

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "-1");

La primera línea establece Cache-control a no-cache, y la segunda línea, añade el resto de atributos no-store, must-revalidate

También, para la buena medida, asegúrese de restablecer el ExpiresDefault en su .htaccess archivo si usted está usando que para habilitar el almacenamiento en caché.

ExpiresDefault "access plus 0 seconds"

Después, puede utilizar ExpiresByType establecer valores específicos para los archivos que desea almacenar en caché:

ExpiresByType image/x-icon "access plus 3 month"

Esto también puede ser útil si su dinámica de archivos, por ej.php, etc.se almacena en la caché del navegador, y que no se puede averiguar por qué.Verificación ExpiresDefault.

Además de los encabezados de considerar la posibilidad de servir a su página a través de https.Muchos navegadores no caché https por defecto.

//In .net MVC
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public ActionResult FareListInfo(long id)
{
}

// In .net webform
<%@ OutputCache NoStore="true" Duration="0" VaryByParam="*" %>

Para completar BalusC -> RESPUESTA Si usted está usando perl puede utilizar CGI para agregar encabezados HTTP.

Usando Perl:

Use CGI;    
sub set_new_query() {
        binmode STDOUT, ":utf8";
        die if defined $query;
        $query = CGI->new();
        print $query->header(
                        -expires       => 'Sat, 26 Jul 1997 05:00:00 GMT',
                        -Pragma        => 'no-cache',
                        -Cache_Control => join(', ', qw(
                                            private
                                            no-cache
                                            no-store
                                            must-revalidate
                                            max-age=0
                                            pre-check=0
                                            post-check=0 
                                           ))
        );
    }

El uso de apache httpd.conf

<FilesMatch "\.(html|htm|js|css|pl)$">
FileETag None
<ifModule mod_headers.c>
Header unset ETag
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
</ifModule>

Nota: Cuando traté de usar la META de html, navegadores ignoró y caché de la página.

Sólo quiero señalar que si alguien quiere evitar el almacenamiento en caché de SÓLO contenido dinámico, la adición de los encabezados adicionales deben ser realizados mediante programación.

He editado el archivo de configuración de mi proyecto para anexar los encabezados no-cache, pero que también se desactiva el almacenamiento en caché de contenido estático, que no suele ser deseable.La modificación de los encabezados de la respuesta en el código asegura que las imágenes y el estilo de los archivos se almacenan en caché.

Esto es bastante obvio, sin embargo, todavía vale la pena mencionar.

Y otra precaución.Tenga cuidado con los ClearHeaders método de la clase HttpResponse.Se le puede dar algunos moretones si se utiliza de forma inapropiada.Como que me dio.

Después de la reorientación en ActionFilterAttribute caso las consecuencias de la limpieza de todas las cabeceras están perdiendo todos los datos de la sesión y los datos en TempData de almacenamiento.Es más seguro para redirigir a partir de una Acción o no borrar los encabezados cuando la redirección está teniendo lugar.

En segundo pensé que restrinjan el uso de ClearHeaders método.Que es mejor para quitar encabezados por separado.Y para establecer el encabezado Cache-Control correctamente estoy usando este código:

filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.AppendCacheExtension("no-store, must-revalidate");

No he tenido suerte con <head><meta> elementos.La adición de caché HTTP parámetros relacionados directamente (fuera del HTML, doc) trabaja de hecho para mí.

Ejemplo de código en Python usando web.py web.header las llamadas de la siguiente manera.He redactado a propósito de mi personal irrelevante utilidad de código.

    import web
    import sys
    import PERSONAL-UTILITIES

    myname = "main.py"

    urls = (
        '/', 'main_class'
    )

    main = web.application(urls, globals())

    render = web.template.render("templates/", base="layout", cache=False)

    class main_class(object):
        def GET(self):
            web.header("Cache-control","no-cache, no-store, must-revalidate")
            web.header("Pragma", "no-cache")
            web.header("Expires", "0")
            return render.main_form()

        def POST(self):
            msg = "POSTed:"
            form = web.input(function = None)
            web.header("Cache-control","no-cache, no-store, must-revalidate")
            web.header("Pragma", "no-cache")
            web.header("Expires", "0")
            return render.index_laid_out(greeting = msg + form.function)

    if __name__ == "__main__":
        nargs = len(sys.argv)
        # Ensure that there are enough arguments after python program name
        if nargs != 2:
            LOG-AND-DIE("%s: Command line error, nargs=%s, should be 2", myname, nargs)
        # Make sure that the TCP port number is numeric
        try:
            tcp_port = int(sys.argv[1])
        except Exception as e:
            LOG-AND-DIE ("%s: tcp_port = int(%s) failed (not an integer)", myname, sys.argv[1])
        # All is well!
        JUST-LOG("%s: Running on port %d", myname, tcp_port)
        web.httpserver.runsimple(main.wsgifunc(), ("localhost", tcp_port))
        main.run()

Vea el enlace a un Estudio de Caso sobre el almacenamiento en Caché:

http://securityevaluators.com/knowledge/case_studies/caching/

Resumen, de acuerdo con el artículo, sólo Cache-Control: no-store funciona en Chrome, Firefox e IE.Es decir acepta otros controles, pero Chrome y Firefox no.El enlace es una buena lectura completa con la historia de almacenamiento en caché y la documentación de prueba de concepto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top