{"id":15685,"date":"2026-11-09T13:15:00","date_gmt":"2026-11-09T12:15:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=15685"},"modified":"2026-10-26T13:14:31","modified_gmt":"2026-10-26T12:14:31","slug":"die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\/","title":{"rendered":"Die R\u00fcckfrage, die nichts spart: ETag, Last-Modified und das ausbleibende 304"},"content":{"rendered":"<p>Eine gespeicherte Antwort gilt als frisch, solange die Cache-Regeln eine Wiederverwendung ohne R\u00fcckfrage beim Server erlauben. Das kann einen Netzabruf sparen. Wird eine Pr\u00fcfung n\u00f6tig, kann ein Validator die erneute \u00dcbertragung des Inhalts vermeiden: Ein passender bedingter GET-Abruf erh\u00e4lt <code>304 Not Modified<\/code>. Anfrage und Verarbeitung kosten weiterhin Zeit. Ein Cache ohne Validatoren bleibt deshalb n\u00fctzlich, solange eine gespeicherte Antwort wiederverwendbar ist.<\/p>\n<p>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\u00e4tzliche Unf\u00e4higkeit von elf ganzen Websites zur bedingten Abfrage.<\/p>\n<figure class=\"lw-diagram\"><img decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/reval-reviewed-de-20261025.png\" width=\"1120\" height=\"580\" loading=\"lazy\" alt=\"Historische Antwort-Header und Einordnung: 304 vermeidet den Inhalt; 200 allein beweist weder \u00c4nderung noch Fehler.\"><figcaption>Historische Antwort-Header und Einordnung: 304 vermeidet den Inhalt; 200 allein beweist weder \u00c4nderung noch Fehler.<\/figcaption><\/figure>\n<h2>Zwei Validatoren mit unterschiedlichen Zusagen<\/h2>\n<p><code>Last-Modified<\/code> beschreibt den letzten \u00c4nderungszeitpunkt mit sekundengenauer Aufl\u00f6sung. Das zugeh\u00f6rige Anfragefeld hei\u00dft <code>If-Modified-Since<\/code>. Mehrere \u00c4nderungen innerhalb einer Sekunde k\u00f6nnen diese Aufl\u00f6sung \u00fcberschreiten.<\/p>\n<p><code>ETag<\/code> ist eine Versionskennung, deren Inhalt der Client nicht deuten muss. Die Kennung wird in <code>If-None-Match<\/code> zur\u00fcckgesendet. Die Zuverl\u00e4ssigkeit h\u00e4ngt von der Erzeugung ab: Ein Inhalts-Hash oder ein anderes geeignetes Versionsverfahren kann \u00c4nderungen unterscheiden, die ein Zeitstempel nicht erfasst. Ein ETag ist nicht automatisch ein Inhalts-Hash.<\/p>\n<p>Ein starker ETag kennzeichnet identische Darstellungsdaten. Ein schwacher ETag wie <code>W\/\"abc\"<\/code> erlaubt gleichwertige Daten ohne Bytegleichheit. Dynamisch erzeugte Seiten ben\u00f6tigen nicht automatisch schwache Tags; ma\u00dfgeblich ist die tats\u00e4chlich eingehaltene Vergleichszusage.<\/p>\n<h2>Was die gespeicherte Stichprobe enth\u00e4lt<\/h2>\n<p>Die archivierten Ergebnisse enthalten f\u00fcnf ETags, darunter drei schwache, sowie f\u00fcnf Last-Modified-Felder. Eine Antwort enth\u00e4lt beides, elf enthalten keines davon. Sechs Antworten nennen <code>no-store<\/code>; 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.<\/p>\n<p>Zwei Ergebnisse tragen einen HTTP-Fehlerhinweis, darunter eine der beiden Antworten ohne Cache-Control. Die gespeicherte Zusammenfassung enth\u00e4lt deren genaue Statuscodes nicht. Die Stichprobe umfasst deshalb nicht zwanzig nachgewiesen erfolgreiche Startseitenantworten und liefert keinen repr\u00e4sentativen Marktanteil.<\/p>\n<p>Der Analyzer vergab sechs Speicherverbote, vier unmittelbare Neuabrufe, drei st\u00e4ndige Revalidierungen, vier F\u00e4lle mit Frische und anschlie\u00dfender Revalidierung, einen mit Frische und Neuabruf sowie zwei heuristische Klassen. Das sind Einordnungen anhand von Headern, keine beobachteten Browserverl\u00e4ufe. Beispielsweise waren 54 Sekunden ein max-age-Wert, kein Nachweis einer exakt so langen Speicherung in jedem Browser.<\/p>\n<h2>Frische und Validierung sind verschiedene Fragen<\/h2>\n<p><code>no-store<\/code> verbietet die Speicherung im HTTP-Cache; <code>no-cache<\/code> verlangt eine erfolgreiche Validierung vor Wiederverwendung. <code>max-age=0<\/code> macht eine Antwort sofort veraltet. Private und gemeinsame Caches k\u00f6nnen unterschiedlichen Regeln folgen, insbesondere bei private oder s-maxage.<\/p>\n<p>Ohne ausdr\u00fccklich festgelegte Frist darf ein Cache unter passenden Voraussetzungen selbst sch\u00e4tzen, wie lange die Antwort wiederverwendbar ist. Das hei\u00dft 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\u00fcck-\/Vorw\u00e4rts-Funktion folgt nicht aus diesem HTTP-Test.<\/p>\n<h2>Kompression und die ETag-Falle<\/h2>\n<p>Apache dokumentiert, dass das standardm\u00e4\u00dfige <code>AddSuffix<\/code>-Verhalten der Kompressionsmodule 304-Antworten f\u00fcr komprimierte Inhalte verhindern kann. Eine bedingte Pr\u00fcfung derselben Variante ist daher sinnvoll. Ein wiederholtes 200 gen\u00fcgt aber nicht als Fehlerbeweis: Die ausgew\u00e4hlte Darstellung kann tats\u00e4chlich ver\u00e4ndert sein.<\/p>\n<p><code>DeflateAlterETag NoChange<\/code> und <code>BrotliAlterETag NoChange<\/code> erhalten den urspr\u00fcnglichen Tag, doch Apache beschreibt ausdr\u00fccklich die daraus entstehende Einschr\u00e4nkung der Varianteneindeutigkeit. Ein gemeinsamer starker Tag f\u00fcr komprimierte und unkomprimierte Bytes wird durch <code>Vary: Accept-Encoding<\/code> nicht korrekt. Vary steuert die Cache-Auswahl; starke Validatoren betreffen die Identit\u00e4t der Darstellungsdaten.<\/p>\n<p>Eine geeignete L\u00f6sung h\u00e4ngt von Server und Cache-Verarbeitung ab: korrekte getrennte starke Tags, richtig behandelte schwache Tags f\u00fcr gleichwertige Darstellungen oder das Entfernen eines ungeeigneten ETags mit entsprechendem Verlust dieser Pr\u00fcfm\u00f6glichkeit. Range-Anfragen und bedingte Antworten ben\u00f6tigen Gegenproben. Ein einzelnes 200 rechtfertigt keine universelle Produktionsdirektive. Die fr\u00fchere pauschale Unbedenklichkeitszusage f\u00fcr NoChange wurde deshalb entfernt.<\/p>\n\n\n<!-- lw-flux-illu 15683-a4 -->\n<figure class=\"lw-illu\"><img src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/illustrationen\/flux-15683-a4.webp\" width=\"1120\" height=\"630\" loading=\"lazy\" decoding=\"async\" alt=\"Zwei Bettdecken mit derselben Schleife, eine aufgesch\u00fcttelt, eine vakuumverpackt und flach. So irref\u00fchrend ist ein gemeinsamer ETag (das Kennzeichen einer Dateiversion) f\u00fcr gepackte und ungepackte Daten.\"><figcaption>Zwei Bettdecken mit derselben Schleife, eine aufgesch\u00fcttelt, eine vakuumverpackt und flach. So irref\u00fchrend ist ein gemeinsamer ETag (das Kennzeichen einer Dateiversion) f\u00fcr gepackte und ungepackte Daten.<\/figcaption><\/figure>\n\n\n<h2>Ein reproduzierbarer bedingter GET-Abruf<\/h2>\n<p>Das Bash-Beispiel ben\u00f6tigt curl ab Version 7.68.0. URL und Kodierungspr\u00e4ferenz bleiben gleich, der empfangene ETag wird unver\u00e4ndert gespeichert. Bei einer ersten Antwort ungleich 200 oder ohne Tag endet das Skript. Die URL ist ein Platzhalter; bei Weiterleitungen ist die gew\u00fcnschte Zieladresse gesondert auszuw\u00e4hlen und zu pr\u00fcfen.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"bash\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Shell<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-bash\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-comment\">#!\/usr\/bin\/env bash<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">set<\/span> <span class=\"cbb-attr\">-euo<\/span> pipefail\n<\/span><span class=\"cbb-line\">url=<span class=\"cbb-string\">'https:\/\/example.com\/style.css'<\/span>\n<\/span><span class=\"cbb-line\">tag_file=<span class=\"cbb-variable\">$(<\/span>mktemp)\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">trap<\/span> <span class=\"cbb-string\">'rm -f \"$tag_file\"'<\/span> EXIT\n<\/span><span class=\"cbb-line\">status=<span class=\"cbb-variable\">$(<\/span><span class=\"cbb-function\">curl<\/span> <span class=\"cbb-attr\">--silent<\/span> <span class=\"cbb-attr\">--show-error<\/span> <span class=\"cbb-attr\">--max-time<\/span> <span class=\"cbb-number\">20<\/span> \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">-H<\/span> <span class=\"cbb-string\">'Accept-Encoding: gzip'<\/span> <span class=\"cbb-attr\">--etag-save<\/span> <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$tag_file<\/span><span class=\"cbb-string\">\"<\/span> \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--output<\/span> \/dev\/null <span class=\"cbb-attr\">--write-out<\/span> <span class=\"cbb-string\">'%{http_code}'<\/span> <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$url<\/span><span class=\"cbb-string\">\"<\/span>)\n<\/span><span class=\"cbb-line\">&#91;&#91; <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$status<\/span><span class=\"cbb-string\">\"<\/span> == <span class=\"cbb-number\">200<\/span> &#93;&#93; <span class=\"cbb-operator\">||<\/span> { <span class=\"cbb-function\">printf<\/span> <span class=\"cbb-string\">'Initial HTTP status: %s\\n'<\/span> <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$status<\/span><span class=\"cbb-string\">\"<\/span> <span class=\"cbb-operator\">&gt;<\/span>&amp;<span class=\"cbb-number\">2<\/span><span class=\"cbb-operator\">;<\/span> <span class=\"cbb-keyword\">exit<\/span> <span class=\"cbb-number\">1<\/span><span class=\"cbb-operator\">;<\/span> }\n<\/span><span class=\"cbb-line\">&#91;&#91; <span class=\"cbb-attr\">-s<\/span> <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$tag_file<\/span><span class=\"cbb-string\">\"<\/span> &#93;&#93; <span class=\"cbb-operator\">||<\/span> { <span class=\"cbb-function\">printf<\/span> <span class=\"cbb-string\">'No ETag received\\n'<\/span> <span class=\"cbb-operator\">&gt;<\/span>&amp;<span class=\"cbb-number\">2<\/span><span class=\"cbb-operator\">;<\/span> <span class=\"cbb-keyword\">exit<\/span> <span class=\"cbb-number\">1<\/span><span class=\"cbb-operator\">;<\/span> }\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">curl<\/span> <span class=\"cbb-attr\">--silent<\/span> <span class=\"cbb-attr\">--show-error<\/span> <span class=\"cbb-attr\">--max-time<\/span> <span class=\"cbb-number\">20<\/span> \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">-H<\/span> <span class=\"cbb-string\">'Accept-Encoding: gzip'<\/span> <span class=\"cbb-attr\">--etag-compare<\/span> <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$tag_file<\/span><span class=\"cbb-string\">\"<\/span> \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--output<\/span> \/dev\/null <span class=\"cbb-attr\">--dump-header<\/span> - <span class=\"cbb-attr\">--write-out<\/span> <span class=\"cbb-string\">'\\nHTTP %{http_code}\\n'<\/span> <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$url<\/span><span class=\"cbb-string\">\"<\/span><\/span><\/code><\/pre><\/figure>\n<p>Die ausgegebenen Antwort-Header zeigen den zweiten ETag und die Kodierung. Eine 304-Antwort enth\u00e4lt keinen Antwortinhalt; bei 200 sind Variante, \u00c4nderung und Serververhalten zu untersuchen. Netzfehler und andere Statuscodes bleiben eigene Ergebnisse. Gleiches Accept-Encoding kontrolliert eine Eingabe, beweist aber weder gleiche gew\u00e4hlte Kompression noch gleichen Inhalt.<\/p>\n<p>Der <a href=\"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/cache-control-revalidation-analyzer\/\">Cache-Control- und Revalidierungs-Analyzer<\/a> sendet empfangenen ETag und Zeitpunkt in getrennten Tests. Ein kombinierter Vorrangtest oder vollst\u00e4ndiger Browsercache ist damit nicht abgebildet. Der Bytez\u00e4hler misst dekodierten Inhalt bis 256 KiB, keinen vollst\u00e4ndigen komprimierten Netzverkehr. Auch ein ge\u00e4nderter ETag mit 200 erh\u00e4lt eine Warnung, obwohl dieses Verhalten korrekt sein kann. Heuristische Dauer und Klassen ben\u00f6tigen daher eine fachliche Einordnung.<\/p>\n<div class=\"lw-faq\"><h2>Fragen und Antworten<\/h2><h3>Was gilt bei beiden Bedingungen in einer Anfrage?<\/h3><p>If-None-Match hat Vorrang; bei vorhandenem Feld wird If-Modified-Since \u00fcbergangen. Ein passender Zeitpunkt setzt einen nicht passenden ETag deshalb nicht au\u00dfer Kraft. Ma\u00dfgeblich ist die tats\u00e4chliche Client-Anfrage; nicht jeder Browser sendet bei jedem Besuch zwangsl\u00e4ufig beide Felder.<\/p><h3>Reicht ein schwacher ETag f\u00fcr 304?<\/h3><p>Ja. If-None-Match vergleicht schwach; <code>W\/\"abc\"<\/code> und <code>\"abc\"<\/code> passen dabei zusammen. Ein schwacher Tag eignet sich dadurch nicht f\u00fcr einen If-Range-Test mit Entity-Tag oder einen starken If-Match-Vergleich.<\/p><h3>Beweist jedes 200 einen Fehler?<\/h3><p>Nein. Eine ge\u00e4nderte Darstellung ben\u00f6tigt normalerweise neuen Inhalt. Zur Diagnose geh\u00f6ren Anfrage, gew\u00e4hlte Variante und zur\u00fcckgelieferter Validator. Browser-Netzwerkansicht, Serverlogs und automatische Tests k\u00f6nnen den Befund zeigen; curl ist eine weitere Methode.<\/p><h3>Spart 304 eine Netz-Rundreise?<\/h3><p>Nein. Eine Validierung \u00fcber das Netz ben\u00f6tigt 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\u00e4ngere Frische, wenn jede Inhalts\u00e4nderung auch eine neue URL erh\u00e4lt.<\/p><\/div>\n<div class=\"lw-quellen\"><h2>Quellen<\/h2><ul><li><a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc9110.html\" target=\"_blank\" rel=\"noopener noreferrer\">RFC 9110: Bedeutung der HTTP-Protokollelemente<\/a><\/li><li><a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc9111.html\" target=\"_blank\" rel=\"noopener noreferrer\">RFC 9111: HTTP-Caching<\/a><\/li><li><a href=\"https:\/\/httpd.apache.org\/docs\/2.4\/mod\/mod_deflate.html#deflatealteretag\" target=\"_blank\" rel=\"noopener noreferrer\">Apache: DeflateAlterETag<\/a><\/li><li><a href=\"https:\/\/httpd.apache.org\/docs\/2.4\/mod\/mod_brotli.html#brotlialteretag\" target=\"_blank\" rel=\"noopener noreferrer\">Apache: BrotliAlterETag<\/a><\/li><li><a href=\"https:\/\/curl.se\/docs\/manpage.html\" target=\"_blank\" rel=\"noopener noreferrer\">curl-Handbuch<\/a><\/li><\/ul><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Bedingte Anfragen k\u00f6nnen Antwortinhalte sparen, frische Cache-Eintr\u00e4ge sogar ganze Abrufe. Eine historische Stichprobe aus zwanzig Antworten zeigt fehlende Validatoren, Grenzen der Auswertung und eine ETag-Falle bei Kompression.<\/p>\n","protected":false},"author":1,"featured_media":24519,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[156],"tags":[92340,92235,92292],"class_list":["post-15685","post","type-post","status-publish","format-standard","hentry","category-tutorials-de-web-entwicklung","tag-server-administration-de","tag-tutorial-de","tag-web-performance-de"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Die R\u00fcckfrage, die nichts spart: ETag, Last-Modified und das ausbleibende 304 | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Wie eine bedingte Anfrage funktioniert, warum elf von zwanzig Startseiten keinen Validator tragen und ein Stylesheet, das nie 304 antwortete.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Die R\u00fcckfrage, die nichts spart: ETag, Last-Modified und das ausbleibende 304 | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Wie eine bedingte Anfrage funktioniert, warum elf von zwanzig Startseiten keinen Validator tragen und ein Stylesheet, das nie 304 antwortete.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-11-09T12:15:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/quality-hero-15685-20261025.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/web-entwicklung\\\/tutorials-de-web-entwicklung\\\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/web-entwicklung\\\/tutorials-de-web-entwicklung\\\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Die R\u00fcckfrage, die nichts spart: ETag, Last-Modified und das ausbleibende 304\",\"datePublished\":\"2026-11-09T12:15:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/web-entwicklung\\\/tutorials-de-web-entwicklung\\\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\\\/\"},\"wordCount\":1010,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/web-entwicklung\\\/tutorials-de-web-entwicklung\\\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/quality-hero-15685-20261025.png\",\"keywords\":[\"Server Administration\",\"Tutorial\",\"Web Performance\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/web-entwicklung\\\/tutorials-de-web-entwicklung\\\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/web-entwicklung\\\/tutorials-de-web-entwicklung\\\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/web-entwicklung\\\/tutorials-de-web-entwicklung\\\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\\\/\",\"name\":\"Die R\u00fcckfrage, die nichts spart: ETag, Last-Modified und das ausbleibende 304 | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/web-entwicklung\\\/tutorials-de-web-entwicklung\\\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/web-entwicklung\\\/tutorials-de-web-entwicklung\\\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/quality-hero-15685-20261025.png\",\"datePublished\":\"2026-11-09T12:15:00+00:00\",\"description\":\"Wie eine bedingte Anfrage funktioniert, warum elf von zwanzig Startseiten keinen Validator tragen und ein Stylesheet, das nie 304 antwortete.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/web-entwicklung\\\/tutorials-de-web-entwicklung\\\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/web-entwicklung\\\/tutorials-de-web-entwicklung\\\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/web-entwicklung\\\/tutorials-de-web-entwicklung\\\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/quality-hero-15685-20261025.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/quality-hero-15685-20261025.png\",\"width\":1200,\"height\":630,\"caption\":\"Die R\u00fcckfrage, die nichts spart: ETag, Last-Modified und das ausbleibende 304\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/web-entwicklung\\\/tutorials-de-web-entwicklung\\\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Die R\u00fcckfrage, die nichts spart: ETag, Last-Modified und das ausbleibende 304\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Die R\u00fcckfrage, die nichts spart: ETag, Last-Modified und das ausbleibende 304 | Lukas Wojcik","description":"Wie eine bedingte Anfrage funktioniert, warum elf von zwanzig Startseiten keinen Validator tragen und ein Stylesheet, das nie 304 antwortete.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\/","og_locale":"en_US","og_type":"article","og_title":"Die R\u00fcckfrage, die nichts spart: ETag, Last-Modified und das ausbleibende 304 | Lukas Wojcik","og_description":"Wie eine bedingte Anfrage funktioniert, warum elf von zwanzig Startseiten keinen Validator tragen und ein Stylesheet, das nie 304 antwortete.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-11-09T12:15:00+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/quality-hero-15685-20261025.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Die R\u00fcckfrage, die nichts spart: ETag, Last-Modified und das ausbleibende 304","datePublished":"2026-11-09T12:15:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\/"},"wordCount":1010,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/quality-hero-15685-20261025.png","keywords":["Server Administration","Tutorial","Web Performance"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\/","url":"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\/","name":"Die R\u00fcckfrage, die nichts spart: ETag, Last-Modified und das ausbleibende 304 | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/quality-hero-15685-20261025.png","datePublished":"2026-11-09T12:15:00+00:00","description":"Wie eine bedingte Anfrage funktioniert, warum elf von zwanzig Startseiten keinen Validator tragen und ein Stylesheet, das nie 304 antwortete.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/quality-hero-15685-20261025.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/quality-hero-15685-20261025.png","width":1200,"height":630,"caption":"Die R\u00fcckfrage, die nichts spart: ETag, Last-Modified und das ausbleibende 304"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/web-entwicklung\/tutorials-de-web-entwicklung\/die-ruckfrage-die-nichts-spart-etag-last-modified-und-das-ausbleibende-304\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Die R\u00fcckfrage, die nichts spart: ETag, Last-Modified und das ausbleibende 304"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/15685","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=15685"}],"version-history":[{"count":10,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/15685\/revisions"}],"predecessor-version":[{"id":30362,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/15685\/revisions\/30362"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/24519"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=15685"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=15685"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=15685"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}