Etags

Los Etags son un mecanismo para que los servidores webs y los navegadores determinen si la copia del compomente que reside en la cache del navegador coincide con la original en el servidor ( con componentes nos referimos a componentes de una página web: imágenes, scripts, hojas de estilo, etc.) Los Etags fueron añadidos como herramienta más flexible para validar elementos que la fecha de last-modified (ultima modificación). El servidor especifica el Etag del componente usando la cabecera de respuesta ETAg.

HTTP/1.1 200 OK
Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT
ETag: “10c24bc-4ab-457e1c1f”
Content-Length: 12195

Después, si el navegador tiene que validar el componente, usa la cabecera If-None-Match para responder al servidor. Si los ETags concuerdan un codigo 304 es devuelto, reduciendo por ejemplo en este caso la respuesta en 12195 bytes.

GET /i/yahoo.gif HTTP/1.1
Host: us.yimg.com
If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT
If-None-Match: “10c24bc-4ab-457e1c1f”
HTTP/1.1 304 Not Modified

El problema de los ETags es que normalmente se definen a partir de atributos que los hacen únicos para el servidor específico que aloja la página. Los Etags no concordarán cuando el navegador descarga el componente original de un servidor y luego intenta validarlo contra otro, como puede ocurrir en entornos en los que se balancea la carga entre varios servidores. Por defecto, tanto Apache como IIS incrustan datos in el Etag que reducen dramáticamente las probabilidades de que los Etags coincidan en entornos multiservidor.

El formato de ETag para Apache 1.3 y 2.x is inode-size-timestamp. Aunque un fichero pueda residir en el mismo directorio en múltiples servidores, y tengan el mismo tamaño, permisos, timestamp,etc., su número de iniod es diferente de un servidor a otro.

IIS 5.0 y 6.0 tienen un problema parecido con los ETags. El formato de los ETags en IIS es Filetimestamp. ChangeNumber. Un ChangeNumber is un contador usado para registrar cambios de configuración en IIS. Es muy poco probable que el ChangeNumber sea el mismo en varios servidores que sirvan la misma página.

El resultado final es que los Etags generados por Apache o IIS para el mismo componente no concordará de un servidor a otro. Si los Etags no concuerdan, el usuario no recibirá la rápida respuesta 304, que es para lo que los ETags están diseñados. En lugar de esto, recibirán un código de respuesta 200 junto con todo el componente. Si estás alojando tu web en sólo un servidor no es un problema. Pero si tienes varios servidores sirviendo el contenido tendrán un mayor consumo de ancho de banda, los proxies no cachearan tu contenido y el usuario final notará las páginas más lentas. Incluso si los compomentes tienen una cabecera Expires mucho tiempo adelante (futuro) un GET condicional se hará cada vez que se pulse Reload o Refresh.

Si no estás obteniendo ninguna mejora por el uso de los Etags lo mejor es desactivar completamente su uso. La cabecera Last-Modified validará en base al timestamp del componente. Eliminando los Etags se reducirá el tamaño de las cabeceras HTTP tanto en la respuestas como en las peticiones. Para desactivarlas en IIS puedes mirar este artículo . En Apache, simplemente añadiendo esta línea al httpd.conf.

FileETag none

Traducción del artículo High Perfomance Web Sites: Rule 13 – Configure Etags .
Documentación apache Etags