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.

Drupal · Schritt für Schritt

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.

Performance-Einstellungen
/admin/config/development/performanceAdmin-UI
# /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)
Kill Switch + EventSubscriber
CacheControlSubscriber.phpEmpfohlen
<?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 (statische Assets)
.htaccessAssets
# .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>
Drupal 10+ und Cache Tags

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.

TerminalVerifizierung
# 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, private

Hä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.

NIS2Art. 21(e) — Sicherheit bei Entwicklung und Wartung von Informationssystemen
DSGVOArt. 32 — Technische Maßnahmen zum Schutz personenbezogener Daten

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.