HTTP zu HTTPS Weiterleitung per .htaccess

HTTP zu HTTPS Weiterleitung per .htaccess

HTTPS ist Pflicht. Chrome, Firefox und Safari warnen seit Jahren vor unverschlüsselten Verbindungen - inzwischen blockieren aktuelle Browser HTTP-Seiten teilweise komplett oder zeigen sie nur noch nach ausdrücklicher Bestätigung an. Dazu kommt: Die DSGVO verlangt eine verschlüsselte Übertragung personenbezogener Daten, und Google wertet SSL als Ranking-Faktor. Ohne HTTPS verlierst du Besucher, Vertrauen und Sichtbarkeit.

Die Umstellung erfordert eine korrekte Weiterleitung aller HTTP-Aufrufe auf HTTPS - per 301-Redirect in der .htaccess-Datei.

HTTP zu HTTPS Weiterleitung - Schloss-Symbol und Pfeil

Dieser Artikel zeigt den fertigen Code zum Kopieren, erklärt die einzelnen Zeilen und beschreibt die Alternative über die VirtualHost-Konfiguration.

Der .htaccess-Code zum Kopieren

Füge diese drei Zeilen in die .htaccess im Wurzelverzeichnis deines Webprojekts ein:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Das war's. Jeder Aufruf über HTTP wird automatisch per 301-Redirect auf die HTTPS-Version der gleichen URL umgeleitet. Die Regel greift für alle Seiten, Bilder, CSS-Dateien und alles andere, was über HTTP angefragt wird.

Was die drei Zeilen bedeuten

Zeile 1: RewriteEngine On

Aktiviert das Apache-Modul mod_rewrite für das aktuelle Verzeichnis. Ohne diese Zeile werden die folgenden RewriteCond- und RewriteRule-Anweisungen ignoriert. Falls du bereits andere Rewrite-Regeln in der .htaccess hast, steht diese Zeile dort vermutlich schon. Dann brauchst du sie nicht doppelt.

Zeile 2: RewriteCond %{HTTPS} off

Die Bedingung prüft, ob der aktuelle Aufruf nicht über HTTPS erfolgt. Nur wenn HTTPS "off" ist (also ein unverschlüsselter HTTP-Aufruf), greift die nachfolgende Regel. Aufrufe, die bereits über HTTPS laufen, bleiben unberührt - das verhindert eine Endlosschleife.

Zeile 3: RewriteRule

Die eigentliche Umleitung. (.*) fängt die gesamte URL ab. https://%{HTTP_HOST}%{REQUEST_URI} baut die Ziel-URL aus dem Hostnamen und dem ursprünglichen Pfad zusammen. Die Flags [R=301,L] bedeuten: permanente Weiterleitung (301) und letzte Regel (L) - keine weitere Verarbeitung.

Alternative Variante: Server-Port prüfen

Manche Server-Konfigurationen melden HTTPS nicht korrekt über die Variable %{HTTPS}. In dem Fall funktioniert die Prüfung über den Server-Port:

RewriteEngine On
RewriteCond %{SERVER_PORT} !^443$
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]

Diese Variante prüft, ob der Port nicht 443 ist (der Standard-Port für HTTPS). Das Ergebnis ist identisch. Beide Varianten leiten zuverlässig von HTTP auf HTTPS um.

Warum 301 und nicht 302?

Der Statuscode 301 signalisiert eine permanente Weiterleitung. Browser, Proxys und Suchmaschinen-Crawler wissen damit: Die HTTP-Version existiert nicht mehr, nur noch HTTPS ist gültig.

Das ist aus zwei Gründen wichtig:

Häufiger Fehler. Wer keinen Statuscode angibt (nur [R,L] statt [R=301,L]), erzeugt einen 302-Redirect. Das ist eine temporäre Weiterleitung. Google geht dann davon aus, dass die HTTP-Seite irgendwann zurückkommt. Für eine SSL-Umstellung immer explizit R=301 setzen.

VirtualHost-Konfiguration (Root-Server)

Wer Zugriff auf die Apache-Konfiguration hat (Root- oder V-Server), kann die Weiterleitung direkt im VirtualHost für Port 80 einrichten. Das ist performanter als eine .htaccess-Regel, weil Apache die .htaccess bei jedem Request lesen muss:

<VirtualHost *:80>
    ServerName www.beispiel.de
    ServerAlias beispiel.de
    RewriteEngine On
    RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>

Nach der Änderung die Konfiguration prüfen und Apache neu laden:

apache2ctl -t
apache2ctl graceful

HSTS-Header setzen

Nach der Umstellung auf HTTPS solltest du zusätzlich den HSTS-Header (HTTP Strict Transport Security) setzen. Damit weist der Server den Browser an, die Domain in Zukunft nur noch über HTTPS aufzurufen - auch wenn der Nutzer http:// eingibt:

Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"

Der Wert max-age=31536000 entspricht einem Jahr. Der Browser merkt sich diese Anweisung und stellt in den folgenden 12 Monaten automatisch jede Verbindung zu deiner Domain auf HTTPS um - ganz ohne den Umweg über die 301-Weiterleitung.

SSL-Zertifikat einrichten

Voraussetzung für HTTPS ist ein gültiges SSL-Zertifikat. Seit 2016 stellt Let's Encrypt kostenlose Zertifikate aus, die von allen Browsern akzeptiert werden. Die meisten Hosting-Anbieter bieten Let's Encrypt direkt im Kundenbereich an - ein Klick genügt.

Tipp: SSL bei All-Inkl Bei All-Inkl sind Let's Encrypt-Zertifikate in allen Tarifen inklusive. Im KAS-Adminbereich unter "Domain" die gewünschte Domain auswählen, "SSL-Schutz bearbeiten" klicken und Let's Encrypt aktivieren. Die Erneuerung läuft automatisch.

Auf einem eigenen Server installierst du den Certbot-Client und richtest die automatische Erneuerung ein. Die Dokumentation auf letsencrypt.org beschreibt den Vorgang für alle gängigen Linux-Distributionen.

Ob dein Zertifikat korrekt eingerichtet ist, prüfst du mit dem kostenlosen SSL Server Test von Qualys SSL Labs. Dort gibst du deine Domain ein und bekommst eine Bewertung von A+ bis F.

SSL Labs Zertifikats-Check mit A+ Bewertung
SSL Labs: Kostenloser Zertifikats-Check mit detaillierter Bewertung

Häufige Fragen

Brauche ich die Weiterleitung noch, wenn ich ein SSL-Zertifikat habe?

Ja. Das Zertifikat allein sorgt nur dafür, dass HTTPS funktioniert. Ohne Weiterleitung sind beide Versionen (HTTP und HTTPS) erreichbar. Das führt zu Duplicate Content und Besucher, die einen alten HTTP-Link klicken, landen auf der unverschlüsselten Seite.

Funktioniert der Code bei jedem Hoster?

Der Code funktioniert auf allen Apache-Servern mit aktiviertem mod_rewrite. Das trifft auf nahezu alle Shared-Hosting-Pakete zu. Auf Nginx-Servern funktioniert .htaccess nicht - dort muss die Weiterleitung in der Server-Konfiguration stehen.

Kann die Weiterleitung eine Endlosschleife auslösen?

Nicht mit dem oben gezeigten Code. Die Bedingung RewriteCond %{HTTPS} off stellt sicher, dass die Regel nur bei HTTP-Aufrufen greift. Bereits verschlüsselte Aufrufe werden nicht erneut umgeleitet. Endlosschleifen entstehen nur, wenn die Bedingung fehlt oder falsch konfiguriert ist.

Verwandte Artikel

Quellen

Kommentararchiv 61

61 Kommentare zwischen 2011 und 2019. Die grosse Mehrheit bestätigte, dass der .htaccess-Code auf Anhieb funktioniert.

301 vs. 302 - Ein häufiges Thema: Warum unbedingt R=301 und nicht R=302? Kurz: Bei 302 behandelt Google HTTP und HTTPS als getrennte Seiten. Die Linkpower wird nicht übertragen. Mehrere Leser hatten genau dieses Problem und konnten es durch den Wechsel auf 301 lösen.

Endlosschleifen - Einige Leser berichteten von Redirect-Loops nach der Umstellung. Ursache war fast immer ein vorgeschalteter Proxy oder Load Balancer, der HTTPS terminiert und den Request intern als HTTP weiterleitet. Die Lösung: Statt %{HTTPS} den Server-Port oder den X-Forwarded-Proto-Header prüfen.

WordPress - Mehrfach kam die Frage, ob man ein Plugin braucht. Nein. Der .htaccess-Code funktioniert mit WordPress genauso. Plugins wie "Really Simple SSL" machen im Kern nichts anderes.

Let's Encrypt (ab 2017) - Mit der Verbreitung kostenloser SSL-Zertifikate verschob sich die Diskussion: Nicht mehr "ob" HTTPS, sondern "wie schnell". Viele Leser berichteten von der unkomplizierten Aktivierung bei ihrem Hoster.