ETag vs Header Expira


He mirado alrededor, pero no he sido capaz de averiguar si debo usar tanto un ETag y un Encabezado Caduca o uno u otro.

Lo que estoy tratando de hacer es asegurarse de que mis archivos flash (y otras imágenes y lo que no solo se actualizan cuando hay un cambio en esos archivos.

No quiero hacer nada especial como cambiar el nombre del archivo o poner algunos caracteres extraños al final de la url para que no se almacene en caché.

También, hay algo que necesidad de hacer programáticamente en mi extremo en mis scripts PHP para soportar esto o es todo Apache?

Author: Trott, 2009-02-01

7 answers

Son ligeramente diferentes - el ETag no tiene ninguna información que el cliente pueda usar para determinar si hacer o no una solicitud para ese archivo de nuevo en el futuro. Si ETag es todo lo que tiene, siempre tendrá que hacer una solicitud. Sin embargo, cuando el servidor lee el ETag de la solicitud del cliente, el servidor puede determinar si desea enviar el archivo (HTTP 200) o decirle al cliente que simplemente use su copia local (HTTP 304). Un ETag es básicamente una suma de comprobación para un archivo que semánticamente cambia cuando cambia el contenido del archivo.

El encabezado Caduca es utilizado por el cliente (y proxies/cachés) para determinar si necesita o no hacer una solicitud al servidor. Cuanto más cerca esté de la fecha de Caducidad, más probable será que el cliente (o proxy) realice una solicitud HTTP para ese archivo desde el servidor.

Así que realmente lo que desea hacer es usar AMBOS encabezados: establezca el encabezado Expira en un valor razonable basado en la frecuencia con la que el contenido cambio. Luego configure los ETags para que se envíen de modo que cuando los clientes envíen una solicitud al servidor, éste pueda determinar más fácilmente si debe o no enviar el archivo de vuelta.

Una última nota sobre ETag - si está utilizando una configuración de servidor de carga equilibrada con varias máquinas que ejecutan Apache, probablemente querrá desactivar la generación de ETag. Esto se debe a que los inodos se utilizan como parte del algoritmo hash ETag que será diferente entre los servidores. Puede configurar Apache para que no use inodes como parte del cálculo, pero luego querrá asegurarse de que las marcas de tiempo en los archivos sean exactamente las mismas, para garantizar que se genere el mismo ETag para todos los servidores.

 649
Author: Marc Novakowski,
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-09-11 08:46:57

Los encabezados Etag y Last-modified son validadores.

Ayudan al navegador y/o a la caché (proxy inverso) a entender si un archivo/página, ha cambiado, incluso si conserva el mismo nombre.

Caduca y Cache-control están dando información de actualización.

Esto significa que informan, el navegador y el inverso entre proxies, hasta qué momento o por cuánto tiempo, pueden mantener la página / archivo en su cache.

Por lo tanto, la pregunta generalmente es qué validador usar, etag o last-modified, y qué encabezado de actualización de información usar, expira o control de caché.

 103
Author: john,
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-11-09 14:29:24

Expires y Cache-Control son "encabezados de caché fuertes"

Last-Modified y ETag son "encabezados de caché débiles"

Primero el navegador comprueba Expires/Cache-Control para determinar si hacer o no una solicitud al servidor

Si tiene que hacer una solicitud, enviará Last-Modified/ETag en la solicitud HTTP. Si el valor Etag del documento coincide con eso, el servidor enviará un código 304 en lugar de 200, y ningún contenido. El navegador cargará el contenido de su caché.

 28
Author: hienbt88,
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-03-04 15:45:10

De forma predeterminada, Apache generará un Etag basado en el número de inodo del archivo, la fecha de última modificación y el tamaño, que debería estar perfectamente bien para hacer lo que quieras. Creo que también generará por defecto un encabezado de Última Modificación basado en la última hora de modificación del archivo en el disco, que también está perfectamente bien para hacer lo que quieras.

Probablemente también debería tener Apache enviar un encabezado Caduca con fecha de un año en el futuro (de acuerdo con http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21 ) para que los navegadores sepan que el contenido es cacheable. Echa un vistazo a mod_expires para configurar eso.

 19
Author: David Z,
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
2009-02-01 01:25:30

Otro resumen:

Necesita usar ambos. Los ETags son una información del "lado del servidor". Caduca es un" lado del cliente " de almacenamiento en caché.

  • Utilice ETags excepto si tiene un servidor de carga equilibrada. Son seguros y permitirán a los clientes saber que deben obtener nuevas versiones de sus archivos de servidor cada vez que cambie algo de su lado.

  • Caduca debe utilizarse con precaución, como si se establece una fecha de caducidad en el futuro, pero desea cambiar uno de los archivos inmediatamente (un archivo JS por ejemplo), algunos usuarios no pueden obtener la versión modificada hasta mucho tiempo!

 13
Author: Benjamin Piette,
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-07-17 17:43:16

Una cosa adicional que me gustaría mencionar que algunas de las respuestas pueden haber perdido es la desventaja de tener ambos ETags y Expires/Cache-control en sus encabezados.

Dependiendo de sus necesidades, puede agregar bytes adicionales en sus encabezados, lo que puede aumentar los paquetes, lo que significa más sobrecarga TCP. Una vez más, debe ver si la sobrecarga de tener ambas cosas en sus encabezados es necesaria o simplemente agregará peso adicional en sus solicitudes, lo que reduce el rendimiento.

Puedes leer más al respecto en esta excelente entrada de blog de Kyle Simpson: http://calendar.perfplanet.com/2010/bloated-request-response-headers /

 1
Author: aneagoie,
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
2016-10-14 19:21:09

En mi opinión, con el encabezado Expire, el servidor puede decirle al cliente cuándo mis datos estarían obsoletos, mientras que con Etag, el servidor verificaría el valor etag para cada solicitud del cliente.

 1
Author: Sunny,
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
2016-12-22 08:36:52