Ich werde künftig alles von www auf non-www umleiten und gleichzeitig SSL erzwingen. Meine Beweggründe für die Umstellung war es, Dubletten im Google-Index zu konsolidieren und mich auf eine einzige URL festzulegen (Nämlich https:// ohne www). Da der Google-Index bisher die http:// variante meiner Website gespeichert hat und ich im Ranking etwas zurückgefallen bin, kann ich durch die Umleitung außerdem eine Neuindexierung anstoßen.
Um das zu erreichen, kann man bei den typischen PHP Servern einfach die .htaccess Datei anlegen und dort Mod Rewrite Code ausführen lassen. Was für mich sofort funktioniert hat:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
Die erste RewriteCond überprüft, ob die Domain mit www. beginnt und entfernt sie, indem sie auf die nicht-www-Version umleitet (https://%1/\$1).
Die zweite RewriteCond prüft, ob der Header X-Forwarded-Proto nicht https ist. Dieser Header wird häufig in Setups verwendet, bei denen ein Reverse-Proxy (wie ein loadbalancer) die HTTPS-Terminierung übernimmt. Wenn die Anfrage nicht bereits HTTPS ist, wird auf die HTTPS-Version der Seite umgeleitet.
Warum es keine unendlichen Umleitungen gibt:
Der X-Forwarded-Proto-Header stellt sicher, dass der Server weiß, ob die Anfrage bereits HTTPS ist. Wenn die Anfrage bereits sicher ist, schlägt die Bedingung RewriteCond %{HTTP:X-Forwarded-Proto} !https fehl, und es erfolgt keine weitere Umleitung.
Dieses Setup funktioniert gut in Umgebungen, in denen HTTPS an einem Proxy oder Lastenausgleich terminiert wird, was in modernen Hosting-Setups üblich ist.
Hast du einen WordPress Blog am laufen, fügst du den Codeschnipsel einfach vor „# BEGIN WordPress“ ein.
Es gibt im Internet auch einige andere Beispiele. Nicht funktioniert hat bei mir etwa:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Dieser Code verlässt sich auf die HTTPS-Variable, die in Proxy-basierten Setups möglicherweise nicht korrekt ist. Das führt eventuell zu unendlichen Umleitungen ERR_TOO_MANY_REDIRECTS
Die HTTPS-Umgebungsvariable wird vom Webserver (z. B. Apache) gesetzt, um anzuzeigen, ob die Verbindung sicher ist. In Setups, in denen HTTPS an einem Reverse-Proxy oder Lastenausgleich terminiert wird, sieht der Webserver die Verbindung jedoch möglicherweise nicht als sicher an. In solchen Fällen bleibt HTTPS off, selbst nach der Umleitung zu HTTPS.
Daher bewertet die Bedingung RewriteCond %{HTTPS} !on immer als true, was dazu führt, dass der Server wiederholt auf die HTTPS-Version umleitet, was zu einer unendlichen Umleitungsschleife führt.