¿Cómo puedo generar un encabezado ETag HTTP para un archivo de recursos?HTTP: Generando encabezado ETag
Respuesta
Una 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 según 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)
he construido una cadena en el formato de "número de archivo inode/marca de fecha/tamaño de archivo". Por lo tanto, si se cambia un archivo en el servidor una vez que se ha enviado al cliente, 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; }
De http://developer.yahoo.com/performance/rules.html#etags:
Por defecto, Apache y IIS incrustar datos en la ETag que reduce drásticamente las posibilidades de que la prueba de validez tener éxito en los sitios web con múltiples servidores.
...
Si usted no está tomando ventaja del modelo de validación flexible que proporcionan ETags, es mejor eliminar sólo la ETag por completo.
Siempre y cuando cambie cada vez que cambie la representación de los recursos, la forma de producirlos depende completamente de usted.
Usted debe tratar de producirlo de una manera que adicionalmente:
- no le requerirá para volver a calcular en cada GET condicional, y
- no cambia si el contenido del recurso hasn 's cambiado
El uso de hash 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 su recurso.
Yo recomendaría no utilizarlos y buscar los encabezados modificados en su lugar.
Askapache tiene un artículo útil sobre esto. (Como lo hacen casi todo lo que parece!)
enlace askapache está roto – bskinnersf
Hmm, eso es una lástima, espero que vuelvan pronto ya que el sitio fue una mina de oro de asesoramiento! –
El enlace es una copia de seguridad ahora. –
cómo generar el etag Apache por defecto 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 yo estaba buscando algo exactamente igual que el etag (el navegador pregunta por un archivo solo si ha cambiado en el servidor), nunca funcionó y terminé usando un truco GET (agregando una marca de tiempo como argumento get a los archivos js).
He estado utilizando Adler-32 como un 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 generador de 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]
- 1. ¿Cómo eliminar el encabezado ETag HTTP de IIS 7.5?
- 2. ¿Qué tiene prioridad: el ETag o el encabezado HTTP Last-Modified?
- 3. Encabezado HTTP - ntCoent-Length
- 4. PHP eliminar encabezado HTTP
- 5. redirect_to custom http encabezado
- 6. encabezado HTTP Accept significa
- 7. redirect_to con encabezado HTTP
- 8. HTTP rango encabezado
- 9. Eliminar Etag de favicon.ico
- 10. ¿Qué es el "encabezado HTTP sin procesar"? ¿Cuál es la diferencia entre "encabezado HTTP" y "encabezado HTTP sin procesar"?
- 11. ¿Qué significa el encabezado HTTP If-None-Match: * mean?
- 12. Encabezado de autorización HTTP ASP.NET
- 13. SoapClient set encabezado HTTP personalizado
- 14. Agregar encabezado HTTP a NSURLRequest
- 15. NSURLRequest configurar el encabezado HTTP
- 16. Encabezado de autorización HTTP personalizado
- 17. Ruby on Rails, cómo deshabilitar/desactivar ETag
- 18. ETag vs cabecera Expira
- 19. Sintaxis para ETag?
- 20. Cómo probar los raíles ETag caching?
- 21. Configuración de PHP Etag confiable
- 22. WCF Soap Actions en el encabezado HTTP o encabezado SOAP?
- 23. ¿Puedo evitar que el encabezado de Etag se emita en AWS Cloudfront?
- 24. ¿Cómo interpretar el encabezado HTTP Aceptar vacío?
- 25. analizar encabezado de respuesta http de wget
- 26. ¿Cómo eliminar un encabezado de respuesta HTTP?
- 27. MVC: agregar encabezado http: ¿controlador o vista?
- 28. Cómo enviar un encabezado HTTP en java
- 29. Encabezado futuro lejano y HTTP 304
- 30. Autenticación HTTP - encabezado WWW-Authenticate - múltiples reinos
Si mtime es la hora en que se modificó por última vez el archivo, entonces ¿para qué sirve el tamaño y el inodo? – Steve
En mi caso, es porque era una ruta computada de un programa CGI. Tienes razón en que, en el caso de una ruta directa, el mtime probablemente sea suficiente. Dado que el costo va a ser principalmente en stat(), no hay ningún cargo adicional por incluir el inodo y el tamaño, que podría proteger del (bastante improbable, por supuesto) caso en que un administrador deshonesto pueda actualizar un archivo y volver a tocarlo el mtime original. –
@MarkHarrison, ¿por qué necesitas las comillas dobles para etag? ¿Es una parte obligatoria de la sintaxis? – Pacerier