Ich werde künftig alles von www auf non-www umleiten und gleichzeitig SSL erzwingen. Aber: Nicht alle Copy&Paste Konfigurationsbeispiele aus dem Internet funktionieren. Mit dem richtigen Code verhinderst du unendlichen Umleitungen.
Meine Beweggründe für die Umstellung waren, 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 diesen Teil, indem sie auf die nicht-www-Version umleitet und alle anderen URL Parameter beibehält.
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 zwischengeschalteter lokaler oder entfernter Dienst die HTTPS-Terminierung übernimmt. Wenn die ursprüngliche Anfrage durch den Nutzer nicht bereits HTTPS ist, wird auf die HTTPS-Version der Seite umgeleitet. Der X-Forwarded-Proto-Header stellt sicher, dass der Server weiß, ob die ursprüngliche Anfrage bereits HTTPS ist. Falls diese Anfrage bereits SSL-gesichert 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 Reverse-Proxy oder Loadbalancer terminiert wird, was in modernen Hosting-Setups üblich ist.
Tipp: 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 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. Dann bewertet das System 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.