Sie unterscheiden sich geringfügig - der ETag verfügt über keine Informationen, anhand derer der Client bestimmen kann, ob er diese Datei in Zukunft erneut anfordern möchte oder nicht. Wenn ETag alles ist, was es hat, muss es immer eine Anfrage stellen. Wenn der Server das ETag jedoch aus der Clientanforderung liest, kann der Server dann bestimmen, ob die Datei gesendet werden soll (HTTP 200) oder der Client angewiesen wird, nur seine lokale Kopie zu verwenden (HTTP 304). Ein ETag ist im Grunde nur eine Prüfsumme für eine Datei, die sich semantisch ändert, wenn sich der Inhalt der Datei ändert.
Der Expires-Header wird vom Client (und den Proxys / Caches) verwendet, um zu bestimmen, ob überhaupt eine Anforderung an den Server gestellt werden muss oder nicht. Je näher Sie dem Ablaufdatum sind, desto wahrscheinlicher ist es, dass der Client (oder Proxy) eine HTTP-Anforderung für diese Datei vom Server stellt.
Sie möchten also BEIDE Header verwenden - setzen Sie den Expires-Header auf einen angemessenen Wert, der davon abhängt, wie oft sich der Inhalt ändert. Konfigurieren Sie dann die zu sendenden ETags so, dass Clients beim Senden einer Anforderung an den Server leichter feststellen können, ob die Datei zurückgesendet werden soll oder nicht.
Ein letzter Hinweis zu ETag: Wenn Sie ein Server-Setup mit Lastenausgleich mit mehreren Computern verwenden, auf denen Apache ausgeführt wird, möchten Sie wahrscheinlich die ETag-Generierung deaktivieren. Dies liegt daran, dass Inodes als Teil des ETag-Hash-Algorithmus verwendet werden, der sich zwischen den Servern unterscheidet. Sie können Apache so konfigurieren, dass keine Inodes als Teil der Berechnung verwendet werden. Dann möchten Sie jedoch sicherstellen, dass die Zeitstempel in den Dateien genau gleich sind, um sicherzustellen, dass für alle Server dasselbe ETag generiert wird.