LW IT Solutions logo LW IT Solutions logo LW IT Solutions
« Blog-Übersicht /Web Entwicklung/Tutorials / Die Rückfrage, die nichts spart: ETag, Last-Modified...
Diesen Artikel in anderen Sprachen lesen:

Die Rückfrage, die nichts spart: ETag, Last-Modified und das ausbleibende 304

Die Rückfrage, die nichts spart: ETag, Last-Modified und das ausbleibende 304

Management Summary

Ein Browser kann Website-Inhalte aufbewahren, damit dieselben Daten nicht erneut geladen werden müssen. Muss die Kopie überprüft werden, helfen Versionskennung oder Änderungsdatum dem Server festzustellen, ob der gespeicherte Stand noch passt. Das kann die erneute Übertragung unveränderter Inhalte sparen; die Rückfrage selbst kostet weiterhin Zeit. Der Beitrag erklärt den Unterschied zwischen Wiederverwenden, Nachfragen und Neuladen. So lässt sich beurteilen, ob die Zwischenspeicherung einer Website unnötige Arbeit tatsächlich verringert.

Inhalt
  1. Zwei Validatoren mit unterschiedlichen Zusagen
  2. Was die gespeicherte Stichprobe enthält
  3. Frische und Validierung sind verschiedene Fragen
  4. Kompression und die ETag-Falle
  5. Ein reproduzierbarer bedingter GET-Abruf
  6. Fragen und Antworten
  7. Quellen

Eine gespeicherte Antwort gilt als frisch, solange die Cache-Regeln eine Wiederverwendung ohne Rückfrage beim Server erlauben. Das kann einen Netzabruf sparen. Wird eine Prüfung nötig, kann ein Validator die erneute Übertragung des Inhalts vermeiden: Ein passender bedingter GET-Abruf erhält 304 Not Modified. Anfrage und Verarbeitung kosten weiterhin Zeit. Ein Cache ohne Validatoren bleibt deshalb nützlich, solange eine gespeicherte Antwort wiederverwendbar ist.

Ein historischer Lauf vom 5. September 2026 untersuchte zwanzig Ausgangsadressen. Elf aufgezeichnete Antworten enthielten weder ETag noch Last-Modified. Das beschreibt die damaligen Antworten, keine grundsätzliche Unfähigkeit von elf ganzen Websites zur bedingten Abfrage.

Historische Antwort-Header und Einordnung: 304 vermeidet den Inhalt; 200 allein beweist weder Änderung noch Fehler.
Historische Antwort-Header und Einordnung: 304 vermeidet den Inhalt; 200 allein beweist weder Änderung noch Fehler.

Zwei Validatoren mit unterschiedlichen Zusagen

Last-Modified beschreibt den letzten Änderungszeitpunkt mit sekundengenauer Auflösung. Das zugehörige Anfragefeld heißt If-Modified-Since. Mehrere Änderungen innerhalb einer Sekunde können diese Auflösung überschreiten.

ETag ist eine Versionskennung, deren Inhalt der Client nicht deuten muss. Die Kennung wird in If-None-Match zurückgesendet. Die Zuverlässigkeit hängt von der Erzeugung ab: Ein Inhalts-Hash oder ein anderes geeignetes Versionsverfahren kann Änderungen unterscheiden, die ein Zeitstempel nicht erfasst. Ein ETag ist nicht automatisch ein Inhalts-Hash.

Ein starker ETag kennzeichnet identische Darstellungsdaten. Ein schwacher ETag wie W/"abc" erlaubt gleichwertige Daten ohne Bytegleichheit. Dynamisch erzeugte Seiten benötigen nicht automatisch schwache Tags; maßgeblich ist die tatsächlich eingehaltene Vergleichszusage.

Was die gespeicherte Stichprobe enthält

Die archivierten Ergebnisse enthalten fünf ETags, darunter drei schwache, sowie fünf Last-Modified-Felder. Eine Antwort enthält beides, elf enthalten keines davon. Sechs Antworten nennen no-store; nur vier dieser sechs haben keine Validatoren. Sieben Antworten besitzen somit keine Validatoren, ohne zugleich no-store vorzugeben. Daraus folgt noch keine Speicherbarkeit: Status, weitere Direktiven und Cache-Art sind ebenfalls relevant.

Zwei Ergebnisse tragen einen HTTP-Fehlerhinweis, darunter eine der beiden Antworten ohne Cache-Control. Die gespeicherte Zusammenfassung enthält deren genaue Statuscodes nicht. Die Stichprobe umfasst deshalb nicht zwanzig nachgewiesen erfolgreiche Startseitenantworten und liefert keinen repräsentativen Marktanteil.

Der Analyzer vergab sechs Speicherverbote, vier unmittelbare Neuabrufe, drei ständige Revalidierungen, vier Fälle mit Frische und anschließender Revalidierung, einen mit Frische und Neuabruf sowie zwei heuristische Klassen. Das sind Einordnungen anhand von Headern, keine beobachteten Browserverläufe. Beispielsweise waren 54 Sekunden ein max-age-Wert, kein Nachweis einer exakt so langen Speicherung in jedem Browser.

Frische und Validierung sind verschiedene Fragen

no-store verbietet die Speicherung im HTTP-Cache; no-cache verlangt eine erfolgreiche Validierung vor Wiederverwendung. max-age=0 macht eine Antwort sofort veraltet. Private und gemeinsame Caches können unterschiedlichen Regeln folgen, insbesondere bei private oder s-maxage.

Ohne ausdrücklich festgelegte Frist darf ein Cache unter passenden Voraussetzungen selbst schätzen, wie lange die Antwort wiederverwendbar ist. Das heißt heuristisches Caching. Zehn Prozent des Abstands zu Last-Modified sind ein Beispielverfahren, keine vorgeschriebene Lebensdauer. Keine der beiden untersuchten Antworten ohne Cache-Control enthielt Last-Modified. Der Datensatz belegt diese Berechnung dort also nicht. Auch das Verhalten der Zurück-/Vorwärts-Funktion folgt nicht aus diesem HTTP-Test.

Kompression und die ETag-Falle

Apache dokumentiert, dass das standardmäßige AddSuffix-Verhalten der Kompressionsmodule 304-Antworten für komprimierte Inhalte verhindern kann. Eine bedingte Prüfung derselben Variante ist daher sinnvoll. Ein wiederholtes 200 genügt aber nicht als Fehlerbeweis: Die ausgewählte Darstellung kann tatsächlich verändert sein.

DeflateAlterETag NoChange und BrotliAlterETag NoChange erhalten den ursprünglichen Tag, doch Apache beschreibt ausdrücklich die daraus entstehende Einschränkung der Varianteneindeutigkeit. Ein gemeinsamer starker Tag für komprimierte und unkomprimierte Bytes wird durch Vary: Accept-Encoding nicht korrekt. Vary steuert die Cache-Auswahl; starke Validatoren betreffen die Identität der Darstellungsdaten.

Eine geeignete Lösung hängt von Server und Cache-Verarbeitung ab: korrekte getrennte starke Tags, richtig behandelte schwache Tags für gleichwertige Darstellungen oder das Entfernen eines ungeeigneten ETags mit entsprechendem Verlust dieser Prüfmöglichkeit. Range-Anfragen und bedingte Antworten benötigen Gegenproben. Ein einzelnes 200 rechtfertigt keine universelle Produktionsdirektive. Die frühere pauschale Unbedenklichkeitszusage für NoChange wurde deshalb entfernt.

Zwei Bettdecken mit derselben Schleife, eine aufgeschüttelt, eine vakuumverpackt und flach. So irreführend ist ein gemeinsamer ETag (das Kennzeichen einer Dateiversion) für gepackte und ungepackte Daten.
Zwei Bettdecken mit derselben Schleife, eine aufgeschüttelt, eine vakuumverpackt und flach. So irreführend ist ein gemeinsamer ETag (das Kennzeichen einer Dateiversion) für gepackte und ungepackte Daten.

Ein reproduzierbarer bedingter GET-Abruf

Das Bash-Beispiel benötigt curl ab Version 7.68.0. URL und Kodierungspräferenz bleiben gleich, der empfangene ETag wird unverändert gespeichert. Bei einer ersten Antwort ungleich 200 oder ohne Tag endet das Skript. Die URL ist ein Platzhalter; bei Weiterleitungen ist die gewünschte Zieladresse gesondert auszuwählen und zu prüfen.

Shell
#!/usr/bin/env bash
set -euo pipefail
url='https://example.com/style.css'
tag_file=$(mktemp)
trap 'rm -f "$tag_file"' EXIT
status=$(curl --silent --show-error --max-time 20 \
  -H 'Accept-Encoding: gzip' --etag-save "$tag_file" \
  --output /dev/null --write-out '%{http_code}' "$url")
[[ "$status" == 200 ]] || { printf 'Initial HTTP status: %s\n' "$status" >&2; exit 1; }
[[ -s "$tag_file" ]] || { printf 'No ETag received\n' >&2; exit 1; }
curl --silent --show-error --max-time 20 \
  -H 'Accept-Encoding: gzip' --etag-compare "$tag_file" \
  --output /dev/null --dump-header - --write-out '\nHTTP %{http_code}\n' "$url"

Die ausgegebenen Antwort-Header zeigen den zweiten ETag und die Kodierung. Eine 304-Antwort enthält keinen Antwortinhalt; bei 200 sind Variante, Änderung und Serververhalten zu untersuchen. Netzfehler und andere Statuscodes bleiben eigene Ergebnisse. Gleiches Accept-Encoding kontrolliert eine Eingabe, beweist aber weder gleiche gewählte Kompression noch gleichen Inhalt.

Der Cache-Control- und Revalidierungs-Analyzer sendet empfangenen ETag und Zeitpunkt in getrennten Tests. Ein kombinierter Vorrangtest oder vollständiger Browsercache ist damit nicht abgebildet. Der Bytezähler misst dekodierten Inhalt bis 256 KiB, keinen vollständigen komprimierten Netzverkehr. Auch ein geänderter ETag mit 200 erhält eine Warnung, obwohl dieses Verhalten korrekt sein kann. Heuristische Dauer und Klassen benötigen daher eine fachliche Einordnung.

Fragen und Antworten

Was gilt bei beiden Bedingungen in einer Anfrage?

If-None-Match hat Vorrang; bei vorhandenem Feld wird If-Modified-Since übergangen. Ein passender Zeitpunkt setzt einen nicht passenden ETag deshalb nicht außer Kraft. Maßgeblich ist die tatsächliche Client-Anfrage; nicht jeder Browser sendet bei jedem Besuch zwangsläufig beide Felder.

Reicht ein schwacher ETag für 304?

Ja. If-None-Match vergleicht schwach; W/"abc" und "abc" passen dabei zusammen. Ein schwacher Tag eignet sich dadurch nicht für einen If-Range-Test mit Entity-Tag oder einen starken If-Match-Vergleich.

Beweist jedes 200 einen Fehler?

Nein. Eine geänderte Darstellung benötigt normalerweise neuen Inhalt. Zur Diagnose gehören Anfrage, gewählte Variante und zurückgelieferter Validator. Browser-Netzwerkansicht, Serverlogs und automatische Tests können den Befund zeigen; curl ist eine weitere Methode.

Spart 304 eine Netz-Rundreise?

Nein. Eine Validierung über das Netz benötigt weiterhin eine Antwort, gegebenenfalls von einem vorgeschalteten Cache statt vom Ursprungsserver. Ein verwendbarer frischer Cache-Eintrag kann diese Anfrage ganz vermeiden. Versionierte statische Dateien erlauben längere Frische, wenn jede Inhaltsänderung auch eine neue URL erhält.

Lukas Wojcik

Lukas Wojcik

Systems architect and technology enthusiast specializing in scalable tracking solutions, GMP Stack (GA4 & GTM), and robust backend architectures. Advocate for clean code and privacy-first design.

Kontakt

Eine Frage oder eine Idee für ein Webprojekt? Schreib mir kurz, worum es geht. Das Formular nutzt reCAPTCHA und formconfirmed zum Schutz vor Spam.

Kommentar schreiben

Randfälle, die der Artikel nicht behandelt, und Rückfragen zum Code sind hier willkommen.

Die E-Mail-Adresse wird nicht veröffentlicht. Pflichtfelder sind mit einem Stern versehen.

LUKASWOJCIK.COM · NEWSLETTER

Neue Ideen im Postfach

Neue Blogartikel, praktische Tools und Einblicke in die Projekte.

Themen auswählen (optional)
Ohne Auswahl: alle Themen.

Erst nach Bestätigung per E-Mail. · Datenschutz

Datenschutz · Newsletter

E-Mail-Adresse, Sprache, Themenauswahl sowie Anmelde- und Bestätigungszeit werden für den Newsletter gespeichert. Versand nur nach Double-Opt-in. Jede Ausgabe enthält eine sofortige Abmeldung. Formconfirmed prüft die Anmeldung auf Spam; dafür werden Formularsignale und die E-Mail-Adresse verarbeitet. Keine Öffnungs- oder Klicktracking-Pixel im Newsletter.

Vollständige Datenschutzerklärung öffnen ↗