Der HSTS-Header (HTTP Strict Transport Security) weist Browser an, sich ausschliesslich per HTTPS mit deiner WordPress-Seite zu verbinden. Ohne diesen Header koennten Besucher versehentlich auf einer unsicheren HTTP-Version deiner Seite landen und waeren damit anfaellig fuer 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 fuer die von dir angegebene Dauer.
Was bewirkt der HSTS-Header genau?
Wenn ein Browser den Strict-Transport-Security-Header empfaengt, speichert er diese Information lokal. Bei jedem zukuenftigen Besuch innerhalb des angegebenen max-age-Zeitraums verweigert der Browser eine Verbindung ueber unverschluesseltes 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 schaedliche Seite umleiten koennte.
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 moechtest, sodass auch der allererste Besuch geschuetzt ist.
Bevor du startest: Stelle sicher, dass HTTPS ueberall 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 fuer die Dauer deiner max-age-Einstellung komplett unerreichbar. Bevor du irgendetwas aktivierst, pruefe Folgendes:
- Dein SSL-Zertifikat ist gueltig und nicht kurz vor dem Ablauf.
- Alle Seiten deiner Website laden korrekt ueber
https://. - Es gibt keine Mixed-Content-Warnungen in der Browser-Konsole (HTTP-Ressourcen, die auf HTTPS-Seiten geladen werden).
- Wenn du
includeSubDomainsverwenden moechtest, muss jede Subdomain ein gueltiges Zertifikat haben und Inhalte ueber HTTPS ausliefern. - Deine WordPress-Website-Adresse und WordPress-Adresse (unter Einstellungen > Allgemein) verwenden beide
https://.
HSTS ueber Apache .htaccess hinzufuegen
Wenn deine WordPress-Seite auf Apache laeuft (die meisten Shared-Hosting-Anbieter nutzen Apache), kannst du den Header direkt in der .htaccess-Datei im WordPress-Stammverzeichnis hinzufuegen. Oeffne die Datei mit einem Texteditor oder dem Dateimanager deines Hosters und fuege 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 standardmaessig aktiv, aber der Wrapper verhindert einen 500-Fehler auf Servern, bei denen es nicht verfuegbar ist.
HSTS ueber Nginx hinzufuegen
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 Schluesselwort 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 fuer Security-Header ist.
Nach der Bearbeitung der Konfiguration teste und lade Nginx neu:
sudo nginx -t
sudo systemctl reload nginxHSTS ueber PHP in der functions.php hinzufuegen
Wenn du keinen Zugang zu Server-Konfigurationsdateien hast (manche Managed-Hoster schraenken dies ein), kannst du den Header per PHP senden. Fuege Folgendes in die functions.php deines aktiven Themes ein oder, noch besser, in ein seitenspezifisches Plugin, damit es Theme-Updates uebersteht:
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. Fuer vollstaendige Abdeckung ist der serverseitige Ansatz immer besser.
HSTS per WordPress-Plugin setzen
Wenn du einen Ansatz ohne Code bevorzugst, koennen mehrere Plugins HSTS fuer dich uebernehmen:
- Really Simple SSL (Pro): die Pro-Version enthaelt ein Security-Header-Modul, in dem du HSTS aktivieren und
max-agesowieincludeSubDomainsueber das Dashboard konfigurieren kannst. - HTTP Headers: ein kostenloses Plugin, das dir eine Oberflaeche zum Setzen verschiedener Security-Header bietet, einschliesslich Strict-Transport-Security.
- Headers Security Advanced & HSTS WP: speziell fuer Security-Header entwickelt, mit einem einfachen Schalter fuer HSTS und Preload.
Plugins sind praktisch, fuegen aber eine zusaetzliche Abhaengigkeit hinzu. Wenn das Plugin deaktiviert oder entfernt wird, verschwinden auch deine Header. Fuer etwas so Grundlegendes wie HSTS ist eine serverseitige Konfiguration zuverlaessiger.
Sichere Rollout-Strategie: Klein anfangen, dann steigern
Direkt mit einem einjaerigen max-age einzusteigen ist riskant, wenn du nicht alles getestet hast. Falls etwas schiefgeht, erzwingen Browser weiterhin HTTPS fuer ein ganzes Jahr, und es gibt keine Moeglichkeit, den Header serverseitig "rueckgaengig" zu machen, sobald ein Browser ihn gecached hat. Folge stattdessen diesem schrittweisen Vorgehen:
- 5 Minuten: setze
max-age=300und surfe auf deiner Seite. Pruefe, ob jede Seite laedt, Formulare korrekt absenden und keine Mixed-Content-Warnungen erscheinen. - 1 Tag: erhoehe auf
max-age=86400. Lass es ein bis zwei Tage laufen und beobachte deine Seite. - 1 Woche: erhoehe auf
max-age=604800. An diesem Punkt solltest du sicher sein, dass HTTPS ueberall funktioniert. - 1 Jahr: setze den endgueltigen Wert
max-age=31536000. Dies ist der Mindestwert fuer die HSTS-Preload-Einreichung. - includeSubDomains hinzufuegen: tue dies erst, wenn alle Subdomains bestaetigt ueber HTTPS funktionieren.
- preload hinzufuegen: fuege 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 ueber HTTPS erfolgt, bevor der Browser jemals deinen Header gesehen hat. Um die Voraussetzungen zu erfuellen, muss deine Seite Folgendes bieten:
- Ein gueltiges 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 vollstaendig auf HTTPS festgelegt bist.
HSTS-Header mit den Browser-DevTools ueberpruefen
Nachdem du den Header hinzugefuegt hast, kannst du schnell bestaetigen, dass er funktioniert:
- Oeffne deine Seite in Chrome oder Firefox.
- Druecke F12, um die DevTools zu oeffnen.
- 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-transportWenn der Header nicht erscheint, pruefe nochmals, ob du die HTTPS-Version besuchst (nicht HTTP) und ob deine Server-Konfigurationsaenderungen gespeichert und neu geladen wurden.
Haeufige HSTS-Fehler und wie du sie vermeidest
- HSTS auf HTTP-Antworten setzen: der Header wird von Browsern ignoriert, wenn er ueber unverschluesseltes 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 fuer vollstaendige Abdeckung.
- includeSubDomains ohne Subdomain-Pruefung verwenden: wenn du eine Subdomain hast, die kein HTTPS unterstuetzt (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 ueberpruefen
Nachdem du den Header hinzugefuegt hast, fuehre einen neuen InspectWP-Scan deiner Seite durch. Der Bereich fuer Sicherheitsheader in deinem Report zeigt den Status des Strict-Transport-Security-Headers an. Wenn alles korrekt konfiguriert ist, erscheint er gruen (vorhanden). Falls du auch andere Security-Header eingerichtet hast, pruefe diese ebenfalls, um ein vollstaendiges Bild der Sicherheitslage deiner Seite zu erhalten.