Gehashte Assets bleiben, die HTML-Shell nicht
JS und CSS mit Content-Hash bekommen ein langes max-age. Das Dokument, das auf diese Hashes zeigt, revalidiert nach jedem Deploy.
Ein gehashter Dateiname ist ein Vertrag. app.abc12.js ändert sich nie. nginx kann ein langes max-age und das immutable-Flag senden. Die HTML-Shell kann das nicht. Nach einem Deploy ist sie das einzige Dokument, das auf die neuen Hashes zeigt. Eine gecachte Shell mit gelöschten Dateien ist die leere Seite für wiederkehrende Besucher.
Fonts und Bilder nutzen jetzt dieselben langen Header. gzip läuft nur für Texttypen. Ein webp oder woff2 zu komprimieren verbrennt CPU ohne Gewinn.
Der Cookie-Bypass
Anonymes GET-HTML läuft zusätzlich durch einen kurzen nginx-Microcache. Der Key ist Scheme, Host, URI und Locale. Query-Strings ohne Einfluss auf die Seite gehören nicht in den Key. Requests mit auth_token umgehen diesen Cache. Ein eingeloggter Nutzer darf kein öffentliches Fragment bekommen.
JSON unter /api bleibt bei PHP. Ein API-Cache in nginx mischte eine Liste einer Locale mit einem Write aus einem anderen Tab.
Der Check nach dem Build
Seite laden. Prüfen dass die Shell revalidiert. Prüfen dass JS und CSS mit langem max-age kommen. Ein fehlendes Vite-Manifest ist schlimmer als ein 500. Die Seite rendert ohne CSS und sieht kaputt aus statt zu werfen.
Die Regel ist kurz. Gehashte Dateien sind immutable. Die HTML-Shell nicht. Cookies umgehen den gemeinsamen HTML-Cache. Das ist das nginx-Update auf dieser Site.
