CORRECCIÓN DE UN BUG DE LA FUNCIÓN
ENCONTRÉ UN ERROR EN UNA FUNCIÓN QUE PUSE ARRIBA Y QUE LLAMÉ
cacheando() y escribo este post para corregirlo.
Lo que sucede es que cuando se solicitaba la página nuevamente, la función enviaba efectivamente un código 304,
PERO no se enviaba nuevamente, junto con ese 304, EL DATO DE LAST-MODIFIED, puesto que la cabecera de LAST-MODIFIED la puse después de que envié el 304 y di exit.
Como resultado de ese error, sólo se envía un 304 la primera vez, pero si se solicita muchas veces más el documento, se enviará la información de
last-modified una vez sí y una vez no, alternándose.
El bug se solucionan poniendo la cabecera de
LAST-MODIFIED siempre, se envíe o no el código 304. Basta con ponerlas antes de de que llame al segundo IF.
Código PHP:
//
function cacheando($archivo){
$ultima_modificacion = "";
if(file_exists($archivo)){
//lo convierto a GMT (Mexico City)
$timestamp_modif = filemtime($archivo)+6*60*60;
//lo ponemos en un string
$ultima_modificacion = date("D, d M Y H:i:s",$timestamp_modif)." GMT";
}//end file_exists
//si el archivo no existe, mensaje de error
else mensaje_final('badcache2');
header("Cache-Control: max-age=0, must-revalidate");
header("Pragma: no cache");
header("Last-Modified: $ultima_modificacion");
//si cabecera contiene una fecha y es igualita a la proporcionada
if($ultima_modificacion == $_SERVER['HTTP_IF_MODIFIED_SINCE']){
//header("Location: http://www.google.com");
//exit;
header("HTTP/1.1 304 Not changed");
exit;
}//end if
}//end function
Sólo lo dejo por si alguien lee esto en el futuro.
AHORA SÍ, POR MÁS QUE SE LE PIQUE "F5" EL DOCUMENTO CARGARÁ CASI INSTANTÁNEAMENTE, PUES EL SERVIDOR, AL SABER QUE EL DOCUMENTO NO HAY CAMBIADO, SE NEGARÁ ROTUNDAMENTE A ENVIARLO DE NUEVO Y LE PEDIRÁ AL NAVEGADOR QUE LO TOME DE SU CACHÉ.