HTTP auf HTTPS weiterleiten mit .htaccess (301-Redirect)

Veröffentlicht am Aktualisiert am 4 Min. Lesezeit

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 -la sehen 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?
301 steht für eine dauerhafte Weiterleitung. Suchmaschinen übertragen damit die Bewertung der bisherigen HTTP-Adresse auf die HTTPS-Adresse. Ein 302 gilt als vorübergehend und gibt diese Signale nicht weiter.
Meine .htaccess-Datei wird ignoriert. Woran liegt das?
Entweder ist mod_rewrite nicht aktiviert, oder der VirtualHost erlaubt keine Overrides. Setzen Sie für Ihr Verzeichnis AllowOverride All und starten Sie Apache danach neu.
Warum lande ich in einer Endlosschleife?
Das passiert fast immer, wenn vor dem Apache ein Reverse-Proxy oder Loadbalancer die Verschlüsselung beendet. Werten Sie dann den Header X-Forwarded-Proto aus statt der Variable HTTPS.
Funktioniert das auch mit nginx?
Nein, nginx kennt keine .htaccess-Dateien. Dort tragen Sie die Weiterleitung direkt im Serverblock für Port 80 ein, mit der Zeile return 301 https://$host$request_uri.
Sollte ich zusätzlich HSTS aktivieren?
HSTS erhöht die Sicherheit, legt Sie aber für die angegebene Laufzeit fest. Aktivieren Sie es erst, wenn HTTPS auf der Domain und allen Subdomains zuverlässig funktioniert.

.htaccess Weiterleitung 301-Redirect HTTPS Apache mod_rewrite HSTS