HTTP auf HTTPS weiterleiten mit .htaccess (301-Redirect)
Besucher landen noch auf der unverschlüsselten Seite? Mit wenigen Zeilen in der .htaccess-Datei leiten Sie jeden HTTP-Aufruf per 301-Redirect dauerhaft auf HTTPS um.
Ihr Server liefert die Webseite bereits über HTTPS aus, aber Besucher landen weiterhin auf der unverschlüsselten HTTP-Version? Dann fehlt eine Weiterleitung. In dieser Anleitung richten Sie mit einer .htaccess-Datei einen dauerhaften Redirect (Statuscode 301) von HTTP auf HTTPS ein.
Ein 301-Redirect ist auch aus SEO-Sicht die richtige Wahl: Suchmaschinen übernehmen damit die Rankings der alten HTTP-Adresse auf die HTTPS-Adresse, statt beide Varianten als getrennte Seiten zu behandeln.
Voraussetzungen
- Auf Ihrem Server läuft Apache. Für nginx gilt eine andere Konfiguration, dazu weiter unten mehr.
- Es ist bereits ein gültiges SSL-Zertifikat eingerichtet. Falls nicht, finden Sie die passende Anleitung im Beitrag SSL-Zertifikat kostenlos mit Let's Encrypt einrichten.
- Sie haben Zugriff auf das Webverzeichnis Ihres Servers, per SSH oder per FTP.
Wichtig: Richten Sie die Weiterleitung erst ein, wenn HTTPS funktioniert. Sonst leiten Sie Besucher auf eine Adresse um, die eine Zertifikatswarnung anzeigt.
mod_rewrite aktivieren und .htaccess erlauben
Die Weiterleitung nutzt das Apache-Modul mod_rewrite. Aktivieren Sie es und starten Sie Apache neu:
a2enmod rewrite
systemctl restart apache2
Damit Apache die .htaccess-Datei überhaupt liest, muss der VirtualHost sie zulassen. Prüfen Sie in der Konfiguration unter /etc/apache2/sites-available/, ob für Ihr Verzeichnis AllowOverride All gesetzt ist:
<Directory /var/www/MeineDomain.de>
AllowOverride All
Require all granted
</Directory>
Steht dort AllowOverride None, wird Ihre .htaccess-Datei stillschweigend ignoriert. Nach einer Änderung an der VirtualHost-Datei ist ein Neustart von Apache nötig.
Die .htaccess-Datei anlegen
Wechseln Sie in das Verzeichnis, in dem Ihre Webseite liegt:
cd /var/www/<IHR-Webverzeichnis>
Öffnen Sie die .htaccess-Datei im Editor. Existiert sie noch nicht, legt der Befehl sie an:
nano .htaccess
Tragen Sie folgende Zeilen ein. Diese Variante prüft direkt, ob die Verbindung verschlüsselt ist, und hängt den kompletten aufgerufenen Pfad an das Ziel an:
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Speichern Sie die Datei mit "STRG + X", danach "Y" und "Enter".
Alternative über den Serverport
Auf älteren Konfigurationen, in denen die Variable HTTPS nicht gesetzt wird, funktioniert stattdessen die Abfrage des Ports:
RewriteEngine On
RewriteCond %{SERVER_PORT} !^443$
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]
Variante hinter einem Reverse-Proxy oder Loadbalancer
Steht vor Ihrem Apache ein Reverse-Proxy oder ein Loadbalancer, der die Verschlüsselung selbst beendet, kommt beim Apache eine unverschlüsselte Anfrage an. Die obige Regel würde dann endlos weiterleiten. Werten Sie in diesem Fall den Header aus, den der Proxy mitschickt:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Weiterleitung testen
Rufen Sie Ihre Domain im Browser über http:// auf. Sie sollten sofort auf https:// landen. Auf der Kommandozeile prüfen Sie den Statuscode direkt:
curl -I http://MeineDomain.de
In der Ausgabe muss HTTP/1.1 301 Moved Permanently stehen, dazu eine Location-Zeile mit der HTTPS-Adresse. Erscheint stattdessen ein Statuscode 302, prüfen Sie, ob wirklich R=301 in der Regel steht.
HSTS aktivieren (optional)
Mit HTTP Strict Transport Security weisen Sie den Browser an, Ihre Domain künftig gar nicht mehr über HTTP aufzurufen. Damit entfällt der erste ungesicherte Aufruf. Aktivieren Sie zuerst das benötigte Modul:
a2enmod headers
systemctl restart apache2
Anschließend ergänzen Sie in der .htaccess-Datei:
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</IfModule>
Beachten Sie: HSTS ist eine Festlegung auf ein Jahr. Solange der Wert im Browser gespeichert ist, lässt sich die Domain nicht mehr über HTTP erreichen. Setzen Sie den Header erst, wenn HTTPS zuverlässig läuft und auch alle Subdomains ein gültiges Zertifikat haben.
Häufige Fehler
- Endlosschleife ("too many redirects"): Fast immer die Folge eines vorgeschalteten Proxys. Verwenden Sie die Variante mit
X-Forwarded-Proto. - Nichts passiert: Entweder ist mod_rewrite nicht aktiv, oder der VirtualHost erlaubt keine .htaccess-Datei (
AllowOverride None). - Fehler 500 nach dem Speichern: Ein Tippfehler in der .htaccess-Datei. Der genaue Grund steht im Apache-Fehlerprotokoll unter
/var/log/apache2/error.log. - Gemischte Inhalte: Die Seite lädt zwar über HTTPS, bindet aber Bilder oder Skripte weiter über HTTP ein. Passen Sie diese Adressen in Ihrem Quelltext oder in der Datenbank an.
- Datei wird nicht gefunden: Die .htaccess-Datei beginnt mit einem Punkt und ist damit versteckt. Mit
ls -lasehen Sie sie.
Weiterleitung ohne .htaccess
Eine .htaccess-Datei wird bei jeder einzelnen Anfrage neu eingelesen. Wenn Sie Zugriff auf die Serverkonfiguration haben, ist es schneller, die Regeln direkt im VirtualHost zu hinterlegen. Für den HTTP-VirtualHost genügt dann:
<VirtualHost *:80>
ServerName MeineDomain.de
Redirect permanent / https://MeineDomain.de/
</VirtualHost>
Nutzen Sie nginx statt Apache, gibt es keine .htaccess-Dateien. Dort tragen Sie die Weiterleitung im Serverblock für Port 80 ein:
server {
listen 80;
server_name MeineDomain.de www.MeineDomain.de;
return 301 https://$host$request_uri;
}
Häufige Fragen
Warum ein 301-Redirect und kein 302?
Meine .htaccess-Datei wird ignoriert. Woran liegt das?
Warum lande ich in einer Endlosschleife?
Funktioniert das auch mit nginx?
Sollte ich zusätzlich HSTS aktivieren?
2022-2026 KernelHost GmbH. Alle Rechte vorbehalten. Diese Anleitung ist urheberrechtlich geschützt. Eine Veröffentlichung auf anderen Webseiten, auch auszugsweise oder in bearbeiteter Form, ist ohne unsere schriftliche Zustimmung nicht gestattet. Zitate mit Quellenangabe und Link sind ausdrücklich willkommen.

