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.