Sie unterscheiden sich geringfügig - der ETag verfügt über keine Informationen, die der Client verwenden kann, um zu bestimmen, ob die Datei in Zukunft erneut angefordert werden soll. Wenn ETag alles ist, was es hat, muss es immer eine Anfrage stellen. Wenn der Server den ETag jedoch von der Clientanforderung liest, kann der Server dann bestimmen, ob die Datei gesendet werden soll (HTTP 200), oder dem Client mitteilen, dass er nur seine lokale Kopie (HTTP 304) verwenden soll. Ein ETag ist im Grunde genommen 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 Proxies/Caches) verwendet, um festzustellen, ob er überhaupt eine Anforderung an den Server senden muss. 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 erstellt.
Also wirklich was Sie tun möchten, ist mit BEIDE Header - setzen Sie die Expires-Header auf einen angemessenen Wert, basierend darauf, wie oft der Inhalt ändert. Konfigurieren Sie anschließend ETags so, dass sie gesendet werden, sodass Clients, die eine Anforderung an den Server senden, leichter feststellen können, ob sie die Datei zurücksenden oder nicht.
Noch eine Anmerkung zu ETag: Wenn Sie ein Load-Balanced-Server-Setup mit mehreren Maschinen mit Apache verwenden, möchten Sie wahrscheinlich die ETag-Generation ausschalten. 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, aber dann sollten Sie sicherstellen, dass die Zeitstempel für die Dateien identisch sind, um sicherzustellen, dass das gleiche ETag für alle Server generiert wird.
https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching (gut im Allgemeinen) –