Son ligeramente diferentes: ETag no tiene ninguna información que el cliente pueda usar para determinar si se va a volver a solicitar o no 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 envía el archivo (HTTP 200) o le dice 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 cliente utiliza el encabezado Expires (y proxies/caches) para determinar si necesita o no realizar una solicitud al servidor. Cuanto más cerca esté de la fecha de caducidad, más probable es que el cliente (o apoderado) realice una solicitud HTTP para ese archivo desde el servidor.
Así que lo que realmente quiere hacer es usar AMBAS cabeceras: establezca el encabezado Vence a un valor razonable en función de la frecuencia con la que cambia el contenido. A continuación, configure los ETags que se enviarán para que cuando los clientes DEBEN enviar una solicitud al servidor, pueda determinar más fácilmente si se envía el archivo o no.
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 inodos 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.
https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching (bueno en general) –