Cache-Control für Netlify konfigurieren
Schritt-für-Schritt-Anleitung: Sicherheitsrelevante Cache-Direktiven auf Netlify — HTML frisch halten, Assets langzeit-cachen, sensible Daten schützen.
Cache-Control auf Netlify
Cache-Control steuert, wie Browser und CDNs Responses zwischenspeichern. Falsche Cache-Konfiguration kann dazu führen, dass sensible Daten in gemeinsam genutzten Caches landen oder veraltete Sicherheitsupdates nicht ankommen. Cache-Control ist mit 8 von 166 Punkten ein relevanter Faktor im Wolf-Agents Web Security Check.
Netlify setzt standardmäßig Cache-Control: public, max-age=0, must-revalidate für HTML-Seiten. Für statische Assets mit Hash im Dateinamen (z.B. main.a1b2c3.js) können Sie aggressive Langzeit-Caches mit immutable nutzen. Sensible Seiten (Login, Dashboard) müssen mit no-store geschützt werden.
Auf Netlify haben Sie drei Wege, Cache-Control zu konfigurieren: netlify.toml (versioniert im Repository), _headers-Datei (im Publish-Verzeichnis) oder Edge Functions (Deno-Runtime) für dynamische Entscheidungen. Die netlify.toml hat dabei Vorrang über _headers-Dateien.
Cache-Strategie per netlify.toml definieren
Definieren Sie unterschiedliche Cache-Strategien für HTML, Assets und sensible Bereiche. Netlify erlaubt pfadbasierte Header-Regeln in der netlify.toml. Die Datei wird im Repository versioniert und bei jedem Deploy automatisch angewendet.
# netlify.toml — Cache-Control Konfiguration
# HTML: Immer frisch vom Server
[[headers]]
for = "/*.html"
[headers.values]
Cache-Control = "public, max-age=0, must-revalidate"
# Statische Assets: Langzeit-Cache mit immutable
[[headers]]
for = "/assets/*"
[headers.values]
Cache-Control = "public, max-age=31536000, immutable"
# Sensible Seiten: Kein Cache
[[headers]]
for = "/dashboard/*"
[headers.values]
Cache-Control = "private, no-store, no-cache, must-revalidate"
# API-Responses: Kein Cache
[[headers]]
for = "/.netlify/functions/*"
[headers.values]
Cache-Control = "private, no-store" # _headers — Cache-Control
/*.html
Cache-Control: public, max-age=0, must-revalidate
/assets/*
Cache-Control: public, max-age=31536000, immutable
/dashboard/*
Cache-Control: private, no-store, no-cache, must-revalidate
# Netlify Functions
/.netlify/functions/*
Cache-Control: private, no-store Wenn sowohl netlify.toml als auch _headers den gleichen Header setzen, gewinnt netlify.toml. Entscheiden Sie sich für einen Weg pro Header, um Verwirrung zu vermeiden.
Edge Function für dynamische Cache-Steuerung
Für komplexe Cache-Logik (z.B. authentifizierte vs. oeffentliche Bereiche) nutzen Sie Edge Functions. Diese laufen in der Deno-Runtime am Edge und können Header basierend auf Cookies, Pfaden oder Request-Eigenschaften dynamisch setzen.
// netlify/edge-functions/cache-control.ts
import type { Context } from "https://edge.netlify.com";
export default async (request: Request, context: Context) => {
const response = await context.next();
const url = new URL(request.url);
// Authentifizierte Bereiche: Kein Cache
if (url.pathname.startsWith("/dashboard")) {
response.headers.set(
"Cache-Control",
"private, no-store, no-cache, must-revalidate"
);
response.headers.set("Pragma", "no-cache");
}
return response;
};
export const config = { path: "/dashboard/*" }; Cache-Header verifizieren
Prüfen Sie die Cache-Header für verschiedene Dateitypen nach dem Deploy. Achten Sie besonders darauf, dass sensible Seiten korrekt mit no-store konfiguriert sind. Testen Sie auch Deploy Previews, da diese unter einer separaten Domain (deploy-preview-*.netlify.app) laufen.
# HTML-Cache prüfen
curl -sI https://ihre-domain.de/ | grep -i cache-control
# Erwartete Ausgabe:
# Cache-Control: public, max-age=0, must-revalidate
# Asset-Cache prüfen
curl -sI https://ihre-domain.de/assets/main.a1b2c3.js | grep -i cache-control
# Erwartete Ausgabe:
# Cache-Control: public, max-age=31536000, immutable
# Sensible Seite prüfen
curl -sI https://ihre-domain.de/dashboard/ | grep -i cache-control
# Erwartete Ausgabe:
# Cache-Control: private, no-store, no-cache, must-revalidate
# Netlify CDN-Cache prüfen (Age-Header)
curl -sI https://ihre-domain.de | grep -iE "x-nf-request-id|age|cache-control"
# Wolf-Agents Web Security Check nutzen:
# https://wolf-agents.com/tools/web-security-check Häufige Fehler bei Cache-Control auf Netlify
Sensible Daten im CDN-Cache
Ohne private, no-store können authentifizierte Responses im Netlify CDN-Cache landen und an andere Benutzer ausgeliefert werden. Setzen Sie no-store für alle personalisierten Seiten wie Dashboard, Profil und Checkout.
immutable ohne Content-Hash
immutable sagt dem Browser, dass sich die Datei nie ändert. Verwenden Sie immutable nur für Assets mit Content-Hash im Dateinamen (z.B. main.a1b2c3.js). Ohne Hash erhalten Nutzer nach einem Update veraltete Dateien.
Netlify CDN überschreibt Header
Netlify setzt eigene Cache-Control Header für bestimmte Asset-Typen. Ihre Konfiguration in netlify.toml hat Vorrang über die Netlify-Defaults. Prüfen Sie nach dem Deploy, ob Ihre Header korrekt greifen.
Deploy Preview mit veraltetem Cache
Deploy Previews laufen unter deploy-preview-*.netlify.app. Browser-Cache von der Produktions-Domain beeinflusst Previews nicht, aber Service Worker können zu Verwirrung führen. Testen Sie Previews im Inkognito-Modus.
Compliance-Relevanz
Korrekte Cache-Konfiguration schützt sensible Daten vor unbeabsichtigtem Zugriff.
PCI DSS
Fordert, dass Kartendaten und personalisierte Zahlungsinformationen nicht in oeffentlichen Caches gespeichert werden. no-store auf Checkout-Seiten ist Pflicht.
DSGVO
Verlangt den Schutz personenbezogener Daten. no-store verhindert, dass Browser personalisierte Inhalte zwischenspeichern und auf gemeinsam genutzten Geräten verfügbar machen.
NIS2
Fordert technische Maßnahmen zur Cybersicherheit. Fehlerhafte Cache-Konfiguration kann zu Datenabfluss führen — ein Verstoß gegen die NIS2-Anforderungen.
Wolf-Agents Check
Bewertet Cache-Control mit bis zu 8 Punkten. Geprüft werden no-store für sensible Bereiche, korrekte max-age-Werte und die Abwesenheit von public auf authentifizierten Seiten.
Wie steht Ihre Domain bei Cache-Control?
Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.