11 julio 2008

Cacheado de Navegadores y mod_expires

En mi opinión pienso que la informática todavía está en pañales para dar un buen servicio al usuario común.

¿En qué baso este razonamiento?.

Es muy sencillo. Yo no sé absolutamente nada de mecánica, pero un coche me puede dar un servicio constante y eventualmente algún fallo que me haga ir al taller, o bien puedo evitarlo con un mantenimiento.

En informática, pese a que el usuario pida un mantenimiento o lleve su ordenador al taller, siempre va a tener que saber algo más.

Todo este rollo tiene relación con una serie de emails que estamos recibiendo en la oficina. No son mayoría, pero si se pueden evitar, mejor.

Los usuarios se descargan un fichero .exe de uno de nuestros servidores. Se lo descargan mal (por problemas en la red, por lentitud, por lo que sea). Ellos ven el icono de instalación y proceden a instalarlo. Cuando lo ejecutan el instalador les dice que hay un fallo de integridad de ficheros y que no puede instalar, y que blah, blah, blah....

Siguiente paso, se lo vuelven a descargar, mejor dicho, creen que se lo vuelven a descargar, porque en realidad el navegador le pregunta al servidor si ha cambiado el fichero, el navegador le responde un código 304, y el navegador lo que hace es copiar el fichero que ya ha descargado, con lo cual vuelve a estar corrupto.

¿Qué solución he encontrado?, pues utilizar el mod_expires de apache. Se utiliza para forzar a los navegadores a que cacheen imágenes, javascripts, etc, pero yo lo he utilizado al revés. He puesto un caché de un segundo de modo que siempre intente descargarse el fichero. El mod_expires en lugar de preguntarle al servidor si ha cambiado el fichero lo que hace es modificar las cabeceras añadiendo una cabecera Etag y modificando la cabecera Cache-Control.

Ahora parece que está funcionando sin problema, tengo que mirar si hay implicaciones en el resto de ficheros por no añadir un comportamiento por defecto, pero parece que va bien.

<IfModule mod_expires.c>
ExpiresActive on
ExpiresByType application/octect-stream A1
</IfModule>