htaccess Redirects bzw. HTTP-Weiterleitungen
Grundlagen und Voraussetzungen für Weiterleitungen
Welche Grundlagen müssen erfüllt sein, damit die Weiterleitungen bzw. Umleitungen in der .htaccess definiert werden können?
- wir gehen hier von einem Apache als Webserver aus
- mod_rewrite installiert und aktiviert (Rewriteengine verfügbar)
- Zugriff auf die Datei .htaccess ist gegeben
In der .htaccess muß die Benutzung der Rewriteengine aktiviert sein. Diese erfolgt über den Befehl
RewriteEngine On
Dieser muß in der .htaccess-Datei zwingend vor den Weiterleitungsregeln stehen, denn erst ab diesem Punkt werden die Regeln auch beachtet.
Jetzt aber zu den Weiterleitungen bzw. Umleitungen am konkreten Beispiel.
SSL-Umleitung (http zu https weiterleiten)
Die Verwendung von HTTPS ist mittlerweile Standard und wird vorausgesetzt. Allerdings ist es mit der Einrichtung eines Zertifikates nicht getan. Es muß auch noch dafür gesorgt werden, dass alle Anfragen an den Webserver automatisch an eine gesicherte Verbindung weitergeleitet bzw. umgeleitet werden. Das kann über die .htaccess geregelt werden (Auch wenn HSTS eine bessere Realisierung ist.).
Hier machen wir eine Umleitung, wenn die Kommunikation nicht über Port 443 (dem Standard-Port von HTTPS) geht:
RewriteCond %{SERVER_PORT} !=443 RewriteRule ^(.*)$ https://www\.domain\.de/$1 [R=301,L]
Ein alternativer Weg ist folgender (Prüfung, ob HTTPS als Protokoll verwendet wurde):
RewriteCond %{HTTPS} !=on RewriteCond %{HTTP_HOST} www\.domain\.de [NC] RewriteRule ^(.*)$ https://www\.domain\.de%{REQUEST_URI} [R=301,L]
Wenn man seine Seite standardmäßig ohne www verwendet, kann man hier natürlich auch gleich auf die entsprechende Domain ohne www weiterleiten. Es ist immer besser, unnötige Weiterleitungen einzusparen, da dadurch Ladezeiten reduziert werden und das am Ende für den User ein besseres Nutzererlebnis bedeutet.
Multidomain-Lösung (Wenn wir nicht nur eine Domain behandeln wollen)
Hier wird der angefragte Host als Variable wieder an das Weiterleitungsziel übergeben.
RewriteCond %{HTTPS} !=on RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Domain mit und ohne www
Ein häufiges Problem ist, dass die Website sowohl mit, also auch ohne www erreichbar ist. Das sollte unbedingt vermieden werden, denn für eine Suchmaschine sind domain.de und www.domain.de unterschiedliche Domains und damit entsteht hier Duplicate Content. Man sollte sich also für eine Variante entscheiden.
Weiterleitung Domain ohne www auf Domain mit www (generischer Ansatz)
Dieser Ansatz definiert keine spezielle Domain, sondern greift bei allen Domains.
RewriteEngine On RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Weiterleitung Domain mit www auf Domain ohne www
RewriteCond %{HTTP_HOST} !^domain\.de$ [NC] RewriteRule ^(.*)$ https://domain.de/$1 [R=301,L]
Weiterleitung Domain ohne www auf Domain mit www
RewriteCond %{HTTP_HOST} ^domain\.de$ [NC] RewriteRule ^(.*)$ https://www.domain.de/$1 [R=301,L]
Achtung: Dieses Vorgehen ist auch bei Multisite-Umgebungen wichtig bzw. wenn man weitere Subdomains nutzt. Sonst werden auch alle Subdomains mit umgeleitet und das ist dann meistens zu viel.
Weiterleitung alles, was nicht www ist auf Domain mit www
RewriteCond %{HTTP_HOST} !^www\.domain\.de$ [NC] RewriteRule ^(.*)$ https://www.domain.de/$1 [R=301,L]
Eine einzelne URL ändern (Domain bleibt gleich)
Wenn sich die URL einer Seite ändert, landen ggf. Besucher, die über Links oder Suchmaschinen kommen, auf einer Fehlerseite. Um dies zu vermeiden, leitet man die entsprechende URL weiter auf die neue Seite. Die Verwendung von "RedirectPermanent" sorgt dafür, dass hier ein Statuscode 308 zurückgeliefert wird.
RedirectPermanent /alte-url.html https://www.domain.de/neue-url.html
Alternativer Weg (hier kann man explizit den gewünschten Statuscode angeben):
Redirect 301 /alte-url.html https://www.domain.de/neue-url.html
URL-Suffix (z.B. .html) ist weg
Beispiel: Durch eine Umstellung werden URLs nun nicht mehr mit dem Suffix .html erzeugt, sondern ohne. Damit wir jetzt keine 404er bekommen, holft folgender Redirect
RewriteRule ^(.*)\.html$ /$1/ [R=301,L]
Ordnernamen ändern
Es soll der Namen eines Ordners geändert werden aber alle enthaltenen Seiten weiterhin unter dem alten Namen erreichbar bleiben:
RewriteRule ^altes-verzeichnis/(.*)$ /neues-verzeichnis/$1 [R=301,L]
Von Subdomain auf Unterseite weiterleiten
Im konkreten Fall haben wir eine alte Subdomain ("subdomain") und wollen alle Inhalte auf eine Unterseite einer anderen Domain weiterleiten. Wichtig ist, dass auch Subdomain und Hauptdomain an diese Stelle terminiert werden, sonst greift die .htaccess hier nicht.
RewriteCond %{HTTP_HOST} ^subdomain.domain.de$ [NC] RewriteRule ^(.*)$ https://www.domain.de/ein-verzeichnis/seitenname.html [R=301,L]
zur Sicherheit machen wir das gleich noch für den Fall, dass jemand vor die Subdomain noch ein www setzt (soll es geben)
RewriteCond %{HTTP_HOST} ^www.subdomain.domain.de$ [NC] RewriteRule ^(.*)$ https://www.domain.de/ein-vereichnis/seitenname.html [R=301,L]
Unterseite einer Subdomain auf Unterseite der Hauptdomain umleiten
Damit kann man auch eine Unterseite einer Subdomain auf eine Unterseite einer anderen Subdomain umleiten.
RewriteCond %{HTTP_HOST} www\.domain\.de$ RewriteCond %{REQUEST_URI} ^\/alte-seite\.html$ RewriteRule .* https://www.domain.de/neue-seite.html [R=301,L]
Auch hier müssen wieder Subdomain und Domain an dieser Stelle steuerbar sein.
Das "R=301" definiert, dass es sich um eine 301 Weiterleitung handelt.
Alle Seiten einer alten Domain auf eine neue Domain weiterleiten
Wenn man den Namen der Domain ändert, gibt es 2 gängige Verfahren, mit den alten URLs umzugehen. Entweder ich möchte die alte URL-Struktur behalten und leite dann einfach alles weiter oder ich leite alle Anfragen auf die Seiten der alten Domain auf die Startseite der neuen Domain weiter. Das kann passieren, wenn man ein Projekt aufgibt und nicht möchte, dass der Besucher einen 404 bekommt.
301 Weiterleitung mit beibehaltung der URL-Struktur
Das leitet alle Anfragen auf die neue Domain um.
RewriteCond %{REQUEST_URI} (.*) RewriteRule ^(.*)$ https://www.neue-domain.de/$1 [L,R=301]
301 Weiterleitung mit beibehaltung der URL-Struktur (definierte Domain)
Wenn man mehrere Domains hat und nur eine spezielle Domain weiterleiten möchte, dann ist das der Weg.
RewriteCond %{HTTP_HOST} www\.alte-domain\.de$ RewriteRule ^(.*)$ https://www.neue-domain.de/$1 [L,R=301]
301 Weiterleitung auf Startseite der anderen Domain
RewriteCond %{REQUEST_URI} (.*) RewriteRule ^(.*)$ https://www.neue-domain.de/ [L,R=301]
301 Weiterleitung aller Anfragen auf eine Unterseite der neuen Domain
Das noch als Extra: Der Anwendungsfall ist z.B. dass man eine Site aufgibt und dann alle Anfragen an eine speziell Unterseite weiterleitet, auf der dann der Besucher informiert werden soll oder man eine Wartungsseite schaltet.
RewriteCond %{REQUEST_URI} (.*) RewriteRule ^(.*)$ https://www.neue-domain.de/zielseite.html [L,R=301]
Das letzte Beispiel kann man auch auch temporär einsetzen, wenn man dann statt des Statuscodes 301 ein 302 zurückgibt und damit sagt, dass die Seite nur temporär verschoben wurde.
Ausschließlich die Startseite weiterleiten
Nur die Startseite soll umgeleitet werden. Alle anderen Seiten bleiben per Deeplink erreichbar.
Im konkreten Fall nutzen wir einen 307er Code, da die Weiterleitung nur temporär ist.
# Prüfen, ob die Anforderung genau der Wurzel / entspricht RewriteCond %{REQUEST_URI} ^/$ # Prüfen, ob die Anforderung für HOSTNAME.de oder www.HOSTNAME.de ist RewriteCond %{HTTP_HOST} ^(www\.)?HOSTNAME\.de$ [NC] # Prüfen, ob die Anfrage nicht bereits www.NEW-HOSTNAME.de ist, um eine Umleitungsschleife zu vermeiden RewriteCond %{HTTP_HOST} !^www\.NEW-HOSTNAME\.de$ [NC] # Umleitung zur neuen URL, wenn beide Bedingungen erfüllt sind RewriteRule ^ http://www.NEW-HOSTNAME.de [L,R=307]
Bots aussperren
Da wir einmal in der .htaccess sind, kann man dort auch störende Bots aussperren. Hier zum Beispiel den "MJ12bot". Im Netz finden sich diverse Listen mit den Useragents der Bots. Diese Regel sorgt dann dafür, dass der Aufruf im Nivana verschwindet.
RewriteCond %{HTTP_USER_AGENT} ^MJ12bot [NC] RewriteRule ^.* - [F,L]
Umfangreiche Möglichkeiten mit einem htaccess redirect
Wie sie sehen, gibt es wirklich zahlreiche Problemstellungen, die für ein htaccess redirect die Lösung ist. Daher lohnt es sich eigentlich fast immer, darüber eine Weiterleitung zu bauen. Es gibt aber auch spezielle Ausnahmefälle, in denen dies besser anders gelöst wird. Grundsätzlich ist ein htaccess redirect schon mal eine der schnellsten (im Sinne der Ladezeiten) Lösungen für Weiterleitungen. Schneller geht es eigentlich nur über den DNS oder in der vhost-Konfiguration des Webservers. Doch oftmals hat man darauf keinen Zugriff, weil man ein shared-Hosting verwendet und dann schon glücklich ist, überhaupt Zugriff auf die .htaccess zu haben.
Es gibt aber auch viele Content-Management-Systeme, die Weiterleitungen in ihrem System unterstützen. Das ist natürlich eine sehr komfortable Lösung, die auch in der Lage ist, Statistiken darüber zu führen, wie häufig eine Weiterleitung verwendet wird. Manche Systeme legen auch automatisch Weiterleitungen an, wenn der Name oder Pfad einer Seite geändert wird.
Der Nachteil dieser Methode ist allerdings die höhere Ladezeit. Bei jedem Aufruf wird erst das CMS angestoßen und geladen und dann dort der entsprechende Return mit Statuscode generiert und ausgeliefert. Über die .htaccess wäre das schon längst erledigt und das CMS noch nicht einmal geladen worden. Das bedeutet natürlich auch wesentlich weniger Last auf dem Server.
Der Vorteil dieser Methode ist, dass auch Redakteure Weiterleitungen anlegen und verwalten können. Einmal angelegte Redirects können auch nachträglich von den Redakteuren bearbeitet werden und z.B. auch wiederverwendet werden. Systeme wie TYPO3 legen auch automatisch Redirects (die dann über das CMS und nicht die .htaccess gehandhabr werden) an, wenn Seiten über das Backend verschoben oder umbenannt werden.