Pregunta

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

¿Fue útil?

Solución

Una etag es una cadena arbitraria que el servidor envía al cliente y que el cliente enviará de vuelta al servidor la próxima vez que se solicite el archivo.

La etag debe ser computable en el servidor según el archivo.Algo así como una suma de verificación, pero es posible que no desees realizar la suma de verificación de 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)

Creé una cadena en el formato "número de inodo de archivo/marca de fecha/tamaño de archivo".Por lo tanto, si se cambia un archivo en el servidor después de haber sido entregado al cliente, la etiqueta etag recién regenerada no coincidirá si el cliente la 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;
}

Otros consejos

Siempre que cambie cada vez que cambie la representación del recurso, la forma en que lo produzca depende completamente de usted.

Deberías intentar producirlo de forma que además:

  1. no requiere que lo vuelvas 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 el punto 1 si no almacena los hashes calculados junto con los archivos.

El uso de números de inodo puede hacer que falle en el punto 2 si reorganiza su sistema de archivos o sirve contenido desde múltiples servidores.

Un mecanismo que puede funcionar es utilizar algo que dependa completamente del contenido, como un hash SHA-1 o una cadena de versión, calculado y almacenado una vez cada vez que cambia el contenido del recurso.

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

De forma predeterminada, tanto Apache como IIS incorporan datos en la ETag, lo que reduce drásticamente las probabilidades de que la prueba de validez tenga éxito en sitios web con múltiples servidores.

...

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

Cómo generar la etiqueta apache predeterminada 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 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 argumento de obtención a los archivos js). ).

He estado usando Adler-32 como acortador de enlaces html.No estoy seguro de si es una buena idea, pero hasta ahora no he notado ningún duplicado.Puede funcionar como generador de etiquetas electrónicas.Y debería ser más rápido que intentar realizar hash usando un esquema de cifrado como sha, pero no lo he verificado.El código que uso es:

 shortlink = str(hex(zlib.adler32(link)+(2**32-1)/2))[2:-1]

Recomendaría no usarlos y optar por encabezados con la última modificación.

Askapache tiene un artículo útil sobre esto.(¡ya que hacen prácticamente todo lo que parece!)

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top