2009-12-15 26 views
14

Tengo una página, index.php, que muestra información basada en un mysql db. Hay formularios y la acción para los formularios está configurada en una página separada llamada process.php. Process.php hace todas las cosas CRUD base de datos, a continuación, utilizaCómo forzar que la página no se guarde en caché en PHP?

header("Location: /webadmin/email/index.php"); 

para enviar al usuario a la página original.

Parece que funciona correctamente, excepto por el hecho de que la página de índice original no siempre refleja los cambios realizados por process.php. Supongo que la página está en caché, porque si hago una actualización (Ctrl + F5), la página mostrará los datos más recientes.

¿Cómo puedo evitar que esta página se guarde en caché? He intentado what the PHP page for header() says, pero parece que no funciona. Las opciones Cache-Control y Expires parecen no tener ningún efecto: la página aún se almacena en caché.

actualización

Ok, yo era parcialmente equivocado. Al parecer, el siguiente funciona en IE:

<?php header("Cache-Control: no-cache, must-revalidate"); 

Sin embargo, se duda de que no funciona en FF, que todavía está mostrando una versión en caché. ¿Alguna idea sobre por qué esto es así y cómo puedo detener el almacenamiento en caché?

+2

malas noticias: http://blogs.imeta.co.uk/JDeabill/ archive/2008/07/14/303.aspx – danii

+0

Aparentemente se ha corregido, pero apuesto a que hay algunas versiones que tienen experiencia con este comportamiento –

+0

Estoy usando la última versión de FF, y todavía veo este comportamiento, a menos que agregue una cadena de consulta falsa al final de la URL. – croceldon

Respuesta

13

Hacer todo navegadores caen en línea:

header("Location: /webadmin/email/index.php?r=".mt_rand(0, 9999999)); 

No es bonito, pero se ajusta a la pregunta planteada: "¿Cómo fuerza .. . "

+0

Esto parece funcionar bien, ¿algún cuerpo tiene alguna idea que sería "bonita"? – croceldon

8
<?php header("Cache-Control: no-cache, must-revalidate"); 
+0

Ok, parece que funciona en IE, pero definitivamente NO funciona en FF. ¿Alguna idea de por qué? – croceldon

0

Trate engañar al navegador con una cadena de consulta espuria:

header("Location: /webadmin/email/index.php?x=1"); 
+3

El encabezado de caché-control es la forma correcta de hacerlo. –

+0

Sí, esto es solo un truco, que a veces puede ser útil, pero no en este caso;) – Strae

+0

'Correcto' no siempre es práctico. – graphicdivine

38

me gustaría jugar con seguridad y hay que intentar sacar todos los asesinos de caché conocidas por el hombre (y el navegador). Mi lista Actualmente se compone de:

<?php 
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: post-check=0, pre-check=0", false); 
header("Pragma: no-cache"); // HTTP/1.0 
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past 
?> 
+0

¿Conoces el orden de precedencia de estos diferentes encabezados? Estoy seguro de que varía según el navegador, pero sería útil saber al menos IE y FF. –

+11

matarlo, quemarlo, arrojar las cenizas al sol en una cápsula sellada –

+1

Acabo de probar todo lo anterior, pero todavía parece estar almacenando en caché la página. – croceldon

14

Este es el orden correcto para que funcione en todos los navegadores:

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

hacer esto y debe prevenir el almacenamiento en caché en todos los navegadores

probado en IE FF y cromo

Cuestiones relacionadas