Cache-Control in Drupal konfigurieren
Sicherheitsrelevante Cache-Direktiven in Drupal — Internal Page Cache, drupal_page_cache_kill_switch und no-store für sensible Seiten.
Cache-Control in Drupal
Cache-Control steuert, wie Browser und Proxies Seiten cachen. Aus Sicherheitssicht ist entscheidend, dass Seiten mit personenbezogenen Daten nicht gecacht werden: Login-Seiten, Dashboards und Benutzerprofile brauchen no-store, private. Im Wolf-Agents Web Security Check bringt Cache-Control 8 von 166 Punkten.
Drupals Internal Page Cache cached anonyme Seiten automatisch. Für eingeloggte Benutzer wird der Cache umgangen. Für zusätzliche Kontrolle nutzen Sie den page_cache_kill_switch Service oder einen EventSubscriber.
Der Wolf-Agents Web Security Check prüft automatisch, ob Ihre Drupal-Seite korrekte Cache-Control-Header setzt und unterscheidet dabei zwischen öffentlichen und sensiblen Seiten. Fehlkonfigurationen werden mit konkreten Handlungsempfehlungen gemeldet.
Implementierung
Konfigurieren Sie das generelle Cache-Verhalten über die Admin-UI und nutzen Sie den Kill Switch oder EventSubscriber für sicherheitskritische Seiten.
# /admin/config/development/performance
# Browser- und Proxy-Caching:
Max-Age: 3600 (1 Stunde für öffentliche Seiten)
# Für sensible Seiten: Cache deaktivieren
# → In Drupal per Code (nicht per Admin-UI)<?php
// In einem Controller oder Hook für sensible Seiten:
\Drupal::service('page_cache_kill_switch')->trigger();
// Oder per EventSubscriber für bestimmte Routen:
public function onResponse(ResponseEvent $event) {
$route = $event->getRequest()->attributes->get('_route');
// Dashboard und User-Seiten: kein Caching
if (str_starts_with($route, 'user.') ||
str_starts_with($route, 'entity.user.')) {
$response = $event->getResponse();
$response->headers->set('Cache-Control',
'no-store, no-cache, must-revalidate, private');
}
}# .htaccess — Cache-Control für statische Assets
<IfModule mod_headers.c>
<FilesMatch "\.(js|css|png|jpg|gif|svg|woff2)$">
Header set Cache-Control "public, max-age=31536000, immutable"
</FilesMatch>
</IfModule>Drupals Cache-Tag-System invalidiert automatisch betroffene Seiten. Der Kill Switch deaktiviert den Page Cache für die aktuelle Anfrage komplett — ideal für Seiten mit personenbezogenen Daten wie Benutzerprofile oder Bestellübersichten.
Verifizierung
Prüfen Sie öffentliche und sensible Seiten getrennt — sie sollten unterschiedliche Cache-Control-Werte haben.
# Cache leeren und Header prüfen
drush cr
curl -sI https://ihre-domain.de | grep -i cache-control
curl -sI https://ihre-domain.de/user/login | grep -i cache-control
# Erwartete Ausgabe (sensible Seiten):
# cache-control: no-store, no-cache, must-revalidate, privateHäufige Fehler
Internal Page Cache liefert gecachte Header
Drupals Internal Page Cache cached auch HTTP-Header. Nach Cache-Control-Änderungen ist ein drush cr zwingend. Auf Produktivseiten kann der Cache dazu führen, dass verschiedene Benutzer unterschiedliche Cache-Header sehen.
Personenbezogene Daten im Cache
Ohne no-store für eingeloggte Benutzer können Proxies personenbezogene Seiten cachen. Nutzen Sie den Kill Switch oder private, no-store für alle Seiten mit personenbezogenen Daten.
CDN ignoriert no-store
Einige CDNs cachen unabhängig von no-store. Konfigurieren Sie CDN-Regeln, um sensible Pfade (z.B. /user/*) vom Caching auszuschließen.
settings.php überschreibt .htaccess-Cache
Die Einstellung $config['system.performance']['cache']['page']['max_age'] in settings.php hat Vorrang vor .htaccess-Direktiven. Prüfen Sie beide Konfigurationen auf Widersprüche.
Compliance-Relevanz
Korrekte Cache-Control-Direktiven verhindern, dass personenbezogene Daten in Browser- oder Proxy-Caches landen — ein zentrales Thema für DSGVO und NIS2.
Zusammenfassung
Cache-Control in Drupal erfordert eine differenzierte Strategie: Öffentliche Seiten profitieren vom Internal Page Cache mit langen Cache-Zeiten, sensible Seiten benötigen no-store, private per Kill Switch oder EventSubscriber. Vergessen Sie nach jeder Änderung das drush cr und prüfen Sie Header für verschiedene Seitentypen separat.
Wie steht Ihre Domain bei Cache-Control?
Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.