language agnostic - specified - HTTP: Generando cabecera ETag
http etags (6)
De http://developer.yahoo.com/performance/rules.html#etags :
De forma predeterminada, tanto Apache como IIS incrustan datos en ETag que reducen drásticamente las probabilidades de que la prueba de validez sea exitosa en sitios web con servidores múltiples.
...
Si no está aprovechando el modelo de validación flexible que proporcionan los ETag, es mejor eliminar el ETag por completo.
¿Cómo puedo generar un encabezado ETag HTTP para un archivo de recursos?
Siempre que cambie cada vez que cambie la representación del recurso, la forma en que lo produzca depende completamente de usted.
Debe tratar de producirlo de una manera que adicionalmente:
- no requiere que vuelva a calcularlo en cada GET condicional, y
- no cambia si el contenido del recurso no ha cambiado
El uso de hashes de contenido puede causar que falle en el n. ° 1 si no almacena los valores hash calculados junto con los archivos.
El uso de números de inodo puede hacer que falle en el n. ° 2 si reorganiza su sistema de archivos o si sirve contenido de varios servidores.
Un mecanismo que puede funcionar es usar algo totalmente dependiente del contenido, como un hash SHA-1 o una cadena de versión, calculada y almacenada una vez cada vez que cambie el contenido de los recursos.
Yo recomendaría no usarlos y buscar encabezados modificados en su lugar.
Askapache tiene un artículo útil sobre esto. (¡ya que hacen casi todo lo que parece!)
Cómo generar el apache etag predeterminado en bash
for file in *; do printf "%x-%x-%x/t$file/n" `stat -c%i $file` `stat -c%s $file` $((`stat -c%Y $file`*1000000)) ; done
Incluso cuando estaba buscando algo exactamente como el etag (el navegador solicita un archivo solo si ha cambiado en el servidor), nunca funcionó y terminé usando un truco GET (agregando una marca de tiempo como un argumento de obtención de los archivos js )
He estado utilizando Adler-32 como acortador de enlaces html. No estoy seguro si esta es una buena idea, pero hasta ahora, no he notado ningún duplicado. Puede funcionar como un generador etag. Y debería ser más rápido que intentar usar hash usando un esquema de encriptación como sha, pero no he verificado esto. El código que uso es:
shortlink = str(hex(zlib.adler32(link)+(2**32-1)/2))[2:-1]
Un etag es una cadena arbitraria que el servidor envía al cliente que el cliente enviará de vuelta al servidor la próxima vez que se solicite el archivo.
El etag debe ser computable en el servidor basado en el archivo. Más o menos como una suma de comprobación, pero es posible que no desee verificar todos los archivos que lo envían.
server client
<------------- request file foo
file foo etag: "xyz" -------->
<------------- request file foo
etag: "xyz" (what the server just sent)
(the etag is the same, so the server can send a 304)
Construí una cadena en el formato "número de inodo de archivo / fecha / tamaño de archivo". Por lo tanto, si se cambia un archivo en el servidor después de que se haya entregado al cliente, el etag recién regenerado no coincidirá si el cliente vuelve a solicitarlo.
char *mketag(char *s, struct stat *sb) { sprintf(s, "%d/%d/%d", sb->st_ino, sb->st_mtime, sb->st_size); return s; }