ETag vs encabezado caduca

359

He mirado a mi alrededor, pero no he podido averiguar si debería usar un ETag y un Encabezado de caducidad o uno u otro.

Lo que intento hacer es asegurarme 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é.

Además, ¿hay algo que deba hacer programáticamente en mis scripts PHP para admitir esto o es todo Apache?

GeoffreyF67
fuente
1
developer.mozilla.org/en-US/docs/Web/HTTP/Caching (bueno en general)
Christophe Roussy

Respuestas:

677

Son ligeramente diferentes: el ETag no tiene ninguna información que el cliente pueda usar para determinar si volverá a hacer una solicitud para ese archivo 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 debe enviar el archivo (HTTP 200) o decirle al cliente que solo use su copia local (HTTP 304). Un ETag es básicamente solo una suma de comprobación para un archivo que cambia semánticamente cuando cambia el contenido del archivo.

El encabezado Expires es utilizado por el cliente (y servidores proxy / cachés) para determinar si incluso necesita realizar una solicitud al servidor. Cuanto más cerca esté de la fecha de caducidad, es más probable que el cliente (o proxy) realice una solicitud HTTP para ese archivo desde el servidor.

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

Una última nota sobre ETag: si está utilizando una configuración de servidor con equilibrio de carga con varias máquinas que ejecutan Apache, es probable que desee desactivar la generación de ETag. Esto se debe a que los inodes se usan 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 la misma ETag para todos los servidores.

Marc Novakowski
fuente
12
También debe verificar si debe usar Cache-Control en lugar de Caduca. Tengo entendido que Cache-Control se introdujo después de caducar y le da más control. Ver stackoverflow.com/questions/5799906/…
Luis Perez
66
Cuando se usa el encabezado Expires, es una buena práctica cambiar el nombre del archivo cada vez que cambia un recurso, ya que el cliente no volverá a solicitar el archivo antes de que esté obsoleto. Especialmente si está utilizando valores del futuro lejano como fecha de caducidad.
schnatterer
8
Digamos que usaremos los dos. ¿Qué sucede cuando el tiempo de caducidad ha expirado, pero el archivo no ha cambiado (el Etag es el mismo)? El servidor devolverá 304 y el archivo se servirá desde la memoria caché del navegador. Mi pregunta es, ¿se regenerará el tiempo de expiración en este momento?
user345602
2
Tenga cuidado al configurar ETAG y el encabezado Expires en un valor distinto de cero. Esto puede conducir a condiciones de carrera. Ver jakearchibald.com/2016/caching-best-practices
Weston
2
¿Es posible decirle a los servidores que no usen inodos o marcas de tiempo? Además, ¿por qué son necesarios para ETags, si solo se usa para representar contenido?
Cesar Castro
108

Los encabezados Etag y Last-modified son validadores .

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

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

Esto significa que informan, el navegador y los proxies intermedios inversos, hasta qué hora o durante cuánto tiempo, pueden mantener la página / archivo en su caché.

Entonces, la pregunta generalmente es cuál validador usar, etag o última modificación, y qué encabezado de información de actualización usar, caduca o control de caché.

Juan
fuente
31

Expiresy Cache-Controlson "fuertes encabezados de almacenamiento en caché"

Last-Modifiedy ETagson "encabezados de almacenamiento en caché débiles"

Primero, la verificación del navegador Expires/Cache-Controlpara determinar si realizar o no una solicitud al servidor

Si tiene que hacer una solicitud, enviará Last-Modified/ETagla solicitud HTTP. Si el Etagvalor 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é.

hienbt88
fuente
1
¿encuentra algún documento que respalde el comportamiento de almacenamiento en caché "fuerte y débil"? No pude encontrar uno, y mi navegador cliente ahora prioriza la última modificación sobre la caducidad, lo que no entiendo por qué.
GMsoF
1
@GMsoF Es posible que desee echar un vistazo a esto: tools.ietf.org/html/rfc7232#section-2.1
Medeiros
Entonces, si quiero asegurarme de que mis cambios se propaguen al cliente de inmediato, pero sigo beneficiándome de un poco de almacenamiento en caché, solo puedo usar Last-Modified y ETag ¿verdad?
Sebastien Lorber
¡Esta es la respuesta más concisa y, sin embargo, la más clara para mí! Gracias.
aderchox hace
18

Por defecto, Apache generará un Etag basado en el número de inodo del archivo, la fecha de la última modificación y el tamaño, lo que debería estar perfectamente bien para hacer lo que desea. 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 desee.

Probablemente también debería hacer que Apache envíe un encabezado Expires 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 almacenable en caché Echa un vistazo a mod_expires para configurar eso.

David Z
fuente
Por lo tanto, el ETag tendrá la última modificación y el encabezado de caducidad le dirá que quiero que lo almacene en caché y cuando cargue y sobrescriba mi archivo, simplemente volverá a la memoria caché del usuario, de lo contrario, se generaría un 304, ¿verdad?
GeoffreyF67
El Etag depende de manera complicada de la fecha de la última modificación; pero cuando modifica el archivo, la etiqueta cambiará. Luego, el Etag enviado por el navegador (para su versión en caché del archivo) no coincidirá con el Etag del archivo en el servidor, y Apache enviará el archivo en lugar de una respuesta 304.
David Z
66
¿El encabezado de un año de vencimiento no le indicará al cliente que ni siquiera busque una nueva versión durante un año?
John Bachir
@ John: sí, supongo que estaba pensando en contenido estático que nunca cambia cuando escribí eso.
David Z
2
@John Bachir: eso debería ser debido a la experiencia, pero el navegador parece golpear de todos modos al servidor al menos para solicitar una versión más nueva. Abrí otra pregunta sobre este tema: stackoverflow.com/questions/10048740/…
Marco Demaio
13

Otro resumen:

Necesitas usar ambos. Los ETag son información del "lado del servidor". Los vencimientos son un almacenamiento en caché del "lado del cliente".

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

  • Los vencimientos deben usarse con precaución, ya que si establece una fecha de vencimiento en el futuro pero quiere cambiar uno de los archivos inmediatamente (un archivo JS por ejemplo), ¡algunos usuarios pueden no obtener la versión modificada hasta mucho tiempo!

Benjamin Piette
fuente
2
En caso de que esta situación caduque, básicamente necesita cambiar el nombre de su js y cambiarlo en su HTML, y espero que no haya establecido que el archivo HTML caduque también durante 1 año.
EralpB
1

Una cosa adicional que me gustaría mencionar que algunas de las respuestas pueden haberse perdido es la desventaja de tener ambas ETagsy Expires/Cache-controlen 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 de TCP. Una vez más, debería ver si la sobrecarga de tener ambas cosas en sus encabezados es necesaria o si solo agregará un peso adicional en sus solicitudes, lo que reduce el rendimiento.

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

aneagoie
fuente
1

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

Soleado
fuente
0

ETag se usa para determinar si un recurso debe usar la copia uno. y vence el encabezado como Cache-Control le dice al cliente que antes de las décadas de caché, el cliente debería buscar el recurso local.

En los sitios modernos, a menudo se ofrece un archivo llamado hash, como app.98a3cf23.js, por lo que es una buena práctica usar Expires Header. Además de esto, también reduce el costo de la red.

Espero eso ayude ;)

Jack Chen
fuente