Cómo el control de la página web de la caché, a través de todos los navegadores?
-
09-06-2019 - |
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é.
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:
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 observarno-store
y algunos observarmust-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
omax-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:
Cache-Control: no-store
Cache-Control: no-cache
(https solamente)Pragma: no-cache
(https solamente)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:
Cache-Control: no-store
<body onunload="">
en htmlCache-Control: no-store
(https solamente)
En IE8 (v8.0.6001.18702 IC) de cualquiera de estos trabajos:
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
(https solamente)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:
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.7Cache-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.7Cache-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, IE8Cache-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, IE8Cache-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:IE8Cache-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:IE8Cache-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:IE8Cache-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:IE8Cache-Control: no-store
Error:Safari 5.1.7, Opera 12.15
Éxito:Chrome 28, FireFox 23, IE8Cache-Control: no-store
<body onunload="">
Error:Opera 12.15
Éxito:Chrome 28, FireFox 23, 8, Safari 5.1.7Cache-Control: no-cache
Error:Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Éxito:IE8Vary: *
Error:Chrome 28, FireFox 23, 8, Safari 5.1.7, Opera 12.15
Éxito:ningunoPragma: no-cache
Error:Chrome 28, FireFox 23, 8, Safari 5.1.7, Opera 12.15
Éxito:ningunoCache-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:IE8Cache-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:IE8Cache-Control: must-revalidate, max-age=0
Error:Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Éxito:IE8Cache-Control: must-revalidate
Expires: 0
Error:Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Éxito:IE8Cache-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:IE8Cache-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:
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:ningunoCache-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:ningunoVary: *
Error:Chrome 28, Safari 5.1.7, Opera 12.15
Éxito:FireFox 23, IE8Pragma: no-cache
Error:Chrome 28, Safari 5.1.7, Opera 12.15
Éxito:FireFox 23, IE8Cache-Control: no-cache
Error:Chrome 28, Safari 5.1.7, Opera 12.15
Éxito:FireFox 23, IE8Cache-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, IE8Cache-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, IE8Cache-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, IE8Cache-Control: must-revalidate
Error:Chrome 28, FireFox 23, 8, Safari 5.1.7
Éxito:Opera 12.15Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
<body onunload="">
Error:Chrome 28, FireFox 23, 8, Safari 5.1.7
Éxito:Opera 12.15Cache-Control: must-revalidate, max-age=0
Error:Chrome 28, FireFox 23, Safari 5.1.7
Éxito:8, Opera 12.15Cache-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.15Cache-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.15Cache-Control: no-store
Error:Opera 12.15
Éxito:Chrome 28, FireFox 23, 8, Safari 5.1.7Cache-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.7Cache-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.7Cache-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, IE8Cache-Control: must-revalidate
Expires: 0
Error:Chrome 28, FireFox 23, Safari 5.1.7,
Éxito:8, Opera 12.15Cache-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.15Cache-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.15Cache-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.15Cache-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.15Cache-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:
- Caduca:Mon, 26 Jul 1997 05:00:00 GMT
- Cache-Control: no-cache, privado, must-revalidate, max-rancio=0, post-check=0, pre-check=0 no-store
- Pragma:no-cache
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
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:
- Algo está obligando a las respuestas que han cache-control:privado en IIS7
- IIS7:Configuración De La Caché De No Trabajar...por qué?
- IIS7 + ASP.NET MVC almacenamiento en Caché de Cliente Encabezados No funciona
- Conjunto de control de caché para las páginas aspx
- Cache-control:no-store, must-revalidate no se envía al navegador del cliente en IIS7 + ASP.NET MVC
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.