Der HSTS-Header (HTTP Strict Transport Security) weist Browser an, sich ausschließlich per HTTPS mit deiner WordPress-Seite zu verbinden. Ohne diesen Header könnten Besucher versehentlich auf einer unsicheren HTTP-Version deiner Seite landen und wären damit anfällig für Man-in-the-Middle-Angriffe. Sobald der Header gesetzt ist, merkt sich der Browser diese Vorgabe und leitet jede Anfrage automatisch auf HTTPS um, und zwar für die von dir angegebene Dauer.
Was bewirkt der HSTS-Header genau?
Wenn ein Browser den Strict-Transport-Security-Header empfängt, speichert er diese Information lokal. Bei jedem zukünftigen Besuch innerhalb des angegebenen max-age-Zeitraums verweigert der Browser eine Verbindung über unverschlüsseltes HTTP. Er versucht nicht einmal zuerst eine HTTP-Verbindung; er geht direkt auf HTTPS. Dadurch wird das kurze Zeitfenster eliminiert, in dem ein Angreifer die initiale HTTP-Anfrage abfangen und den Nutzer auf eine schädliche Seite umleiten könnte.
Der Header hat drei wichtige Parameter:
- max-age: wie lange (in Sekunden) der Browser sich merken soll, HTTPS zu erzwingen. Der Wert
31536000entspricht einem Jahr. - includeSubDomains: wendet die Regel auch auf alle Subdomains an (z. B. blog.example.com, shop.example.com).
- preload: signalisiert, dass du deine Domain in die im Browser integrierte HSTS-Preload-Liste aufnehmen lassen möchtest, sodass auch der allererste Besuch geschützt ist.
Bevor du startest: Stelle sicher, dass HTTPS überall funktioniert
Dieser Schritt ist entscheidend. Sobald HSTS aktiv ist, lassen Browser keinen Fallback auf HTTP zu. Wenn dein SSL-Zertifikat abgelaufen, falsch konfiguriert oder auf einer Subdomain nicht vorhanden ist, werden diese Seiten für die Dauer deiner max-age-Einstellung komplett unerreichbar. Bevor du irgendetwas aktivierst, prüfe Folgendes:
- Dein SSL-Zertifikat ist gültig und nicht kurz vor dem Ablauf.
- Alle Seiten deiner Website laden korrekt über
https://. - Es gibt keine Mixed-Content-Warnungen in der Browser-Konsole (HTTP-Ressourcen, die auf HTTPS-Seiten geladen werden).
- Wenn du
includeSubDomainsverwenden möchtest, muss jede Subdomain ein gültiges Zertifikat haben und Inhalte über HTTPS ausliefern. - Deine WordPress-Website-Adresse und WordPress-Adresse (unter Einstellungen > Allgemein) verwenden beide
https://.
HSTS über Apache .htaccess hinzufügen
Wenn deine WordPress-Seite auf Apache läuft (die meisten Shared-Hosting-Anbieter nutzen Apache), kannst du den Header direkt in der .htaccess-Datei im WordPress-Stammverzeichnis hinzufügen. Öffne die Datei mit einem Texteditor oder dem Dateimanager deines Hosters und füge den folgenden Block vor dem Abschnitt # BEGIN WordPress ein:
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
</IfModule>
Der IfModule-Wrapper stellt sicher, dass Apache diese Direktive nur verarbeitet, wenn mod_headers aktiviert ist. Bei den meisten Hostern ist es standardmäßig aktiv, aber der Wrapper verhindert einen 500-Fehler auf Servern, bei denen es nicht verfügbar ist.
HSTS über Nginx hinzufügen
Bei Nginx-basiertem Hosting (verbreitet bei Managed-WordPress-Hostern wie Kinsta, Cloudways oder SpinupWP) fügst du den Header in deinem server-Block hinzu. Die Konfigurationsdatei befindet sich normalerweise unter /etc/nginx/sites-available/deinedomain.de oder in einem benutzerdefinierten Nginx-Include-Verzeichnis deines Hosters:
server {
listen 443 ssl;
server_name example.com;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# ... Rest deiner Server-Konfiguration
}
Das Schlüsselwort always am Ende ist wichtig. Ohne es sendet Nginx den Header nur bei erfolgreichen Antworten (2xx). Mit always wird er auch bei Fehlerseiten (4xx, 5xx) mitgesendet, was das korrekte Verhalten für Security-Header ist.
Nach der Bearbeitung der Konfiguration teste und lade Nginx neu:
sudo nginx -t
sudo systemctl reload nginx
HSTS über PHP in der functions.php hinzufügen
Wenn du keinen Zugang zu Server-Konfigurationsdateien hast (manche Managed-Hoster schränken dies ein), kannst du den Header per PHP senden. Füge Folgendes in die functions.php deines aktiven Themes ein oder, noch besser, in ein seitenspezifisches Plugin, damit es Theme-Updates übersteht:
function iwp_add_hsts_header() {
if ( ! is_admin() ) {
header( 'Strict-Transport-Security: max-age=31536000; includeSubDomains; preload' );
}
}
add_action( 'send_headers', 'iwp_add_hsts_header' );
Beachte, dass PHP-basierte Header nur auf Seiten angewendet werden, die von WordPress verarbeitet werden. Statische Dateien (Bilder, CSS, JS), die direkt von Apache oder Nginx ausgeliefert werden, tragen diesen Header nicht. Für vollständige Abdeckung ist der serverseitige Ansatz immer besser.
HSTS per WordPress-Plugin setzen
Wenn du einen Ansatz ohne Code bevorzugst, können mehrere Plugins HSTS für dich übernehmen:
- Really Simple SSL (Pro): die Pro-Version enthält ein Security-Header-Modul, in dem du HSTS aktivieren und
max-agesowieincludeSubDomainsüber das Dashboard konfigurieren kannst. - HTTP Headers: ein kostenloses Plugin, das dir eine Oberfläche zum Setzen verschiedener Security-Header bietet, einschließlich Strict-Transport-Security.
- Headers Security Advanced & HSTS WP: speziell für Security-Header entwickelt, mit einem einfachen Schalter für HSTS und Preload.
Plugins sind praktisch, fügen aber eine zusätzliche Abhängigkeit hinzu. Wenn das Plugin deaktiviert oder entfernt wird, verschwinden auch deine Header. Für etwas so Grundlegendes wie HSTS ist eine serverseitige Konfiguration zuverlässiger.
Sichere Rollout-Strategie: Klein anfangen, dann steigern
Direkt mit einem einjährigen max-age einzusteigen, ist riskant, wenn du nicht alles getestet hast. Falls etwas schiefgeht, erzwingen Browser weiterhin HTTPS für ein ganzes Jahr, und es gibt keine Möglichkeit, den Header serverseitig „rückgängig" zu machen, sobald ein Browser ihn gecached hat. Folge stattdessen diesem schrittweisen Vorgehen:
- 5 Minuten: setze
max-age=300und surfe auf deiner Seite. Prüfe, ob jede Seite lädt, sich Formulare korrekt absenden lassen und keine Mixed-Content-Warnungen erscheinen. - 1 Tag: erhöhe auf
max-age=86400. Lass es ein bis zwei Tage laufen und beobachte deine Seite. - 1 Woche: erhöhe auf
max-age=604800. An diesem Punkt solltest du sicher sein, dass HTTPS überall funktioniert. - 1 Jahr: setze den endgültigen Wert
max-age=31536000. Dies ist der Mindestwert für die HSTS-Preload-Einreichung. - includeSubDomains hinzufügen: tue dies erst, wenn alle Subdomains bestätigt über HTTPS funktionieren.
- preload hinzufügen: füge das
preload-Flag hinzu und reiche deine Domain unter hstspreload.org ein.
Deine Seite bei der HSTS-Preload-Liste einreichen
Die HSTS-Preload-Liste ist ein Verzeichnis von Domains, die Browser mit integrierter HSTS-Erzwingung ausliefern. Das bedeutet, dass selbst der allererste Besuch deiner Seite über HTTPS erfolgt, bevor der Browser jemals deinen Header gesehen hat. Um die Voraussetzungen zu erfüllen, muss deine Seite Folgendes bieten:
- Ein gültiges SSL-Zertifikat ausliefern.
- Allen HTTP-Traffic auf HTTPS auf demselben Host umleiten.
- Den
Strict-Transport-Security-Header mit einemmax-agevon mindestens31536000(ein Jahr) senden. - Die
includeSubDomains-Direktive enthalten. - Die
preload-Direktive enthalten.
Besuche hstspreload.org, gib deine Domain ein und reiche sie ein. Beachte, dass die Entfernung von der Preload-Liste Monate dauert und einen Browser-Update-Zyklus erfordert. Reiche deine Domain also nur ein, wenn du vollständig auf HTTPS festgelegt bist.
HSTS-Header mit den Browser-DevTools überprüfen
Nachdem du den Header hinzugefügt hast, kannst du schnell bestätigen, dass er funktioniert:
- Öffne deine Seite in Chrome oder Firefox.
- Drücke F12, um die DevTools zu öffnen.
- Gehe zum Netzwerk-Tab und lade die Seite neu.
- Klicke auf die Hauptdokument-Anfrage (normalerweise die erste).
- Scrolle nach unten zu Antwort-Header (Response Headers).
- Suche nach
Strict-Transport-Security. Du solltest deinen konfigurierten Wert sehen.
Du kannst auch die Kommandozeile verwenden:
curl -sI https://example.com | grep -i strict-transport
Wenn der Header nicht erscheint, prüfe nochmals, ob du die HTTPS-Version besuchst (nicht HTTP) und ob deine Server-Konfigurationsänderungen gespeichert und neu geladen wurden.
Häufige HSTS-Fehler und wie du sie vermeidest
- HSTS auf HTTP-Antworten setzen: der Header wird von Browsern ignoriert, wenn er über unverschlüsseltes HTTP ausgeliefert wird. Er wirkt nur bei HTTPS-Antworten.
- Statische Dateien vergessen: wenn du HSTS per PHP setzt, umgehen statische Dateien WordPress und tragen den Header nicht. Nutze eine serverseitige Konfiguration für vollständige Abdeckung.
- includeSubDomains ohne Subdomain-Prüfung verwenden: wenn du eine Subdomain hast, die kein HTTPS unterstützt (z. B. ein alter Staging-Server), wird sie unerreichbar.
- Zu schnell auf ein langes max-age springen: beginne immer mit einer kurzen Dauer und arbeite dich hoch.
- SSL-Zertifikat-Erneuerung vergessen: mit aktivem HSTS und einem abgelaufenen Zertifikat ist deine Seite komplett unerreichbar. Richte eine automatische Erneuerung mit Let's Encrypt oder deinem Zertifikatsanbieter ein.
HSTS-Setup mit InspectWP überprüfen
Nachdem du den Header hinzugefügt hast, führe einen neuen InspectWP-Scan deiner Seite durch. Der Bereich für Sicherheitsheader in deinem Report zeigt den Status des Strict-Transport-Security-Headers an. Wenn alles korrekt konfiguriert ist, erscheint er grün (vorhanden). Falls du auch andere Security-Header eingerichtet hast, prüfe diese ebenfalls, um ein vollständiges Bild der Sicherheitslage deiner Seite zu erhalten.