HTTP: Generar Encabezado ETag


¿Cómo puedo generar un encabezado HTTP ETag para un archivo de recursos?

Author: Stu Thompson, 2008-08-07

6 answers

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. Algo así como una suma de comprobación, pero es posible que no desee checksum cada archivo que lo envía.

 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 "file inode number/datestamp/file size". Por lo tanto, si un archivo se cambia en el servidor después de que se ha servido al cliente, el el etag recién regenerado no coincidirá si el cliente lo vuelve a solicitar.

char *mketag(char *s, struct stat *sb)
{
    sprintf(s, "%d/%d/%d", sb->st_ino, sb->st_mtime, sb->st_size);
    return s;
}
 16
Author: Mark Harrison,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-25 22:44:32

Mientras cambie cada vez que cambie la representación de recursos, la forma de producirla depende completamente de usted.

Debes tratar de producirlo de una manera que además:

  1. no requiere que lo vuelva a calcular en cada GET condicional, y
  2. no cambia si el contenido del recurso no ha cambiado

El uso de hashes de contenido puede hacer que falle en #1 si no almacena los hashes calculados junto con los archivos.

El uso de números de inodo puede hacer que falle en #2 si reorganiza su sistema de archivos o sirve contenido desde 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 del recurso.

 17
Author: Justin Sheehy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-09 13:50:17

De http://developer.yahoo.com/performance/rules.html#etags:

De forma predeterminada, tanto Apache como IIS incrustan datos en el ETag que reduce drásticamente las probabilidades de que la prueba de validez tenga éxito en sitios web con varios servidores.

...

Si no está aprovechando el modelo de validación flexible que proporcionan los ETags, es mejor eliminar el ETag por completo.

 6
Author: grom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-07 10:13:20

Cómo generar el etag predeterminado de apache 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 pide 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 get a los archivos js).

 2
Author: lolesque,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-05 12:38:09

He estado usando Adler-32 como acortador de enlaces html. No estoy seguro de si esto 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 entonces tratando de hash usando un esquema de cifrado 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]
 1
Author: peawormsworth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-27 15:58:39

Recomendaría no usarlos y optar por los encabezados last-modified en su lugar.

Askapache tiene un artículo útil sobre esto. (como lo hacen casi todo lo que parece!)

Http://www.askapache.com/htaccess/apache-speed-etags.html

 0
Author: Rich Bradshaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-19 22:31:32