Howto: Die wichtigsten Weiterleitungen über htaccess

UPDATES

  • 21.09.15: Thematische Anpassung und Korrekturen
  • 02.12.13: weiteren Weiterleitungstyp hinzugefügt

Oft ist es bei einem Onlineshop nötig, bestimmte URLs weiter zu leiten. Die beste Möglichkeit, um Links um zu leiten, ist in meinen Augen über die .htaccess-Datei, da man hier die größte Freiheit hat. Im folgenden möchte ich eine Sammlung von Anweisungen veröffentlichen, die ich bei verschiedenen Projekten benutze.

Mögliche Gründe für eine Weiterleitung:

  • Die Domain eines Shops hat sich geändert
  • Zusammenführung von Domains oder Subdomains
  • Relaunch eines Shops und die damit verbundene Änderung der URL-Struktur
  • Löschung von Inhalten
  • für Tracking-Zwecke

Weiterleitungen aktivieren

Um eine Weiterleitung überhaupt erst zu ermöglichen, muss zuerst das Weiterleitungsmodul aktiviert werden. Hierfür benötigt man folgende Anweisung:

RewriteEngine On

Diese Anweisung muss einmalig VOR allen folgenden Anweisungen stehen.

Hierarchie von Weiterleitungen

Der Server geht die htaccess von oben nach unten durch. Bei der Kombination verschiedener Weiterleitungen ist also darauf zu achten, dass diese in der richtigen Reihenfolge ausgeführt werden. Der Server verwendet immer die erste Weiterleitung, deren Bedingung erfüllt ist.

Beim Aufbau der Regeln sollte also darauf geachtet werden, eher mit wichtigen bzw. speziellen Anweisungen zu beginnen und am Ende die allgemeinen zu haben.

Umleitung von „Subdomain www“ auf „Domain ohne www“

Diese Weiterleitung lässt sich relativ einfach realisieren mit folgender pauschaler Anweisung realisieren:

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

Bei dieser Anweisungen werden alle Deeplinks und Parameter mit übernommen. Der Besucher würde also von „http://www.domain.com“ zu „http://domain.com“ weitergeleitet werden. Genauso aber auch von „http://www.domain.com/index.html“ zu „http://domain.com/index.html“.

Umleitung von „ohne Subdomain“ auf „Domain mit www“

Auch umgedreht ist dies einfach möglich:

RewriteCond %{HTTP_HOST} ^DOMAIN.de$ [NC] RewriteRule ^(.*) http://www.DOMAIN.de/$1 [L,R=301]

Weiterleitung einer einzelnen Unterseite

Hierfür benötigt man folgende Anweisung:

RedirectMatch 301 ALTER_PFAD$ ZIEL_PFAD$1

Die beiden Pfade müssen ersetzt werden. Ein Beispiel könnte dann so aussehen:

RedirectMatch 301 /index.html$ /startseite$1

Hier würde der Besucher bei dem Aufruf von „http://domain.com/index.html“ weiter geleitet werden zu „http://domain.com/startseite“.

Weiterleitung inkl. Unterseiten

Möchte man nicht nur eine einzelne Seite umleiten, sonder gleich alle, die einen bestimmten Pfad enthalten, muss die Anweisung angepasst werden

RedirectMatch 301 ALTER_PFAD ZIEL_PFAD$1

Die beiden Pfade müssen ersetzt werden. Ein Beispiel könnte dann so aussehen:

RedirectMatch 301 /thema1 /thema_neu$1

Hier würde der Besucher bei dem Aufruf von „http://domain.com/thema1″ wieder weiter geleitet werden zu „http://domain.com/thema_neu“. Die Weiterleitung greift aber auch für Unterseiten, wie „http://domain.com/thema1/seite1″.

Weiterleitung einer Unterseite auf eine andere Domain

Natürlich muss man nicht immer nur innerhalb einer Domain umleiten. Um eine einzelne Unterseite auf eine andere Domain um zu leiten, muss als Ziel-Pfad nur die ganze URL angegeben werden.

RedirectMatch 301 ALTER_PFAD ZIEL_URL$1

Das Beispiel würde dann also wie folgt aussehen:

RedirectMatch 301 /thema1 http://thema1.de/startseite$1

Parameter Umleiten

Oft reicht es nicht, nur statische Seiten oder Ordner um zu leiten. Müssen Parameter umgeleitet werden, werden die Anweisungen etwas komplizierter.

RewriteCond %{query_STRING} ^PARAMETER(.*)$
RewriteRule ^SEITE$ ZIEL-URL? [R=301,L]

Beispiel:

RewriteCond %{query_STRING} ^lang=en(.*)$
RewriteRule ^startseite$ /english/? [R=301,L]

Hier greift die Weiterleitung  von „http://domain.com/startseite“ zu „http://domain.com/english/“ nur, wenn der Parameter „lang=en“ gesetzt ist.

Parameter Löschen

Es ist nicht nur möglich, Parameter zum zu leiten, sondern diese auch zu löschen:

RewriteCond %{QUERY_STRING} PARAMETER$
RewriteRule ^(.*)$ /$1? [R=301,L]

Beispiel:

RewriteCond %{QUERY_STRING} lang=de$
RewriteRule ^(.*)$ /$1? [R=301,L]

Hierbei wird auf jeder Seite, z.B. „http://domain.com/startseite?lang=de“ der Parameter entfernt, also zu „http://domain.com/startseite“ umgeleitet.

Das ganze funktioniert auch, wenn man den Parameter unabhängig vom Wert löschen will. Hierfür einfach folgenden Code verwenden:

RewriteCond %{query_STRING} id=(.*)$$
RewriteRule ^(.*)$ /$1? [R=301,L]

Weiterleitungstypen

Da es nicht nur eine Weiterleitung gibt, stellt sich die Frage, wann welche zu verwenden ist. Im Kern gibt es 2 verschiedene Weiterleitungen:

Permanente Weiterleitung – 301

Diese Weiterleitung ist zu verwenden, wenn die Weiterleitung dauerhaft bestehen bleiben soll. Dies ist meist der Fall. Vor allem aber, wenn gelöschte URLs zu einem neuen Ziel umgeleitet werden.

Temporäre Weiterleitung – 302

Hier geht es um Umleitungen die nur vorübergehend sind. Das beste Beispiel hierfür sind Umleitungen während Wartungsarbeiten.

Die Umleitung selber ist in beiden Fällen technisch gleich. Der Statuscode ist jedoch für beispielsweise Suchmaschinen wichtig. Diese entscheiden anhand des Statuscodes, wie mit der alten URL umzugehen ist.

Komplikationen mit dem Shopsystem (oder CMS)

Nahezu alle Shopsysteme, CMS oder Frameworks benötigen eigene htaccess-Weiterleitungen um zu funktionieren. Dies führt gelegentlich zu Komplikationen mit eigenen Anweisungen. Vor allem die Kombination aus WordPress und Parameter-Weiterleitungen war bei mir oft problematisch.

Um dieses Problem zu beheben, reicht es oft, die fragwürdige Anweisung einfach VOR bzw. ÜBER die Anweisungen des Systems zu schreiben. So greifen diese zuerst.

Probleme mit Sonderzeichen

Alle Anweisungen in der htaccess werden mit der Reg-Ex-Logik gebaut. Da Regex selber viele Sonderzeichen als Operatoren nutzt, gibt es Komplikationen mit den Sonderzeichen in URLs.

Hier eine Übersicht über die wichtigsten Reg-Ex-Operatoren:

 ^ . $ ? * + ( ) [ ]

Soll eines dieser Zeichen in der URL vorkommen, sollte dieses mittels eines \ escapet werden.

So wird z.B. aus „index.html“ „index\.html“

htaccess testen

Es gibt auch praktische Online-Tools mit denen man die wichtigsten htaccess-Weiterleitungen testen kann. Eines davon findest du unter htaccess.mwl.be

 

Ich hoffe ich konnte euch bei euren Fragen und Problemen helfen. Wenn du noch weitere Fragen zum Thema htaccess-Weiterleitungen hast, stelle diese gerne in den Kommentaren.

Leave a Comment:

18 comments
Steffen says 19. Juni 2014

Hallo Jan,

eine Frage zur Weiterleitung mit Parametern. Ich möchte folgendes umleiten:
RedirectMatch 301 /irgendwas.php\?id=1 http://www.externe-domain.de$1

nur leider tut er es nicht. Wo ist der Fehler?

Vielen Dank für deine Hilfe…

Reply
    Jan says 21. Juni 2014

    Hallo Steffen,

    guck mal unter dem Abschnitt „Parameter umleiten“. Was du möchtest, funktioniert über ein einfaches RedirectMatch nicht. Es müsste wie folgt lauten:

    RewriteCond %{query_STRING} ^id=1(.*)$
    RewriteRule ^irgendwas\.php$ http://www.externe-domain.de? [R=301,L]

    Reply
      Steffen says 21. Juni 2014

      Hi Jan, perfekt! Jetzt klappt die Weiterleitung – 1000 Dank!

      Reply
Christian Wimmer says 1. Juli 2014

Hallo Jan!

Tolle Tipps!!

Aber ich schaffe es einfach nicht, dass ich http://www.nega.at auf http://www.nega.at/cms-neu umleite.

Ok, die Umleitung funktioniert, aber ich möchte, dass in der Adresszeile http://www.nega.at stehen bleibt.

Derzeit ist sie so umgeleitet:
RewriteEngine on
RewriteRule ^(/)?$ http://www.nega.at/cms-neu/ [R=301,L]

Kannst du mir helfen?

Reply
    Christian Wimmer says 1. Juli 2014

    habs gerade geschafft!!

    RewriteEngine on

    RewriteCond %{HTTP_HOST} ^(www.)?mustermann.de$

    RewriteCond %{REQUEST_URI} !^/unterordner/

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    RewriteRule ^(.*)$ /unterordner/$1

    RewriteCond %{HTTP_HOST} ^(www.)?mustermann.de$
    RewriteRule ^(/)?$ unterordner/index.php [L]

    Reply
      Christian Wimmer says 1. Juli 2014

      sorry, doch nicht ganz das gewünschte.
      Sobald ich einen Link auf der Seite anklicke, kommt wieder zB http://www.nega.at/cms-neu/index.php/videoalbum.

      🙁

      Reply
        Jan says 2. Juli 2014

        Hi

        verstehe ich das richtig, das du zu einem Unterordner leiten willst, dieser aber nicht in der Adresszeile stehen soll? Dies wird nicht gehen. Denn wenn du weiterleitest, steht das Weiterleitungsziel aus zwangsweise in der Adresszeile (weil du dann ja da bist). Diese Weiterleitungen sind nicht zum Faken von Adresse gemacht.

        Aber wenn du deine Webseite jetzt einfach in einem (neuen) Unterordner hast, kannst du doch die Domain direkt auf den Unterordner zeigen lassen. Wenn aktuell nega.at beim Hoster aus (z.B.) „/html/“ eingestellt ist, kannst du es ja auf „/html/cms-neu/“ umstellen.

        Hilft dir das weiter?

        Reply
Pepi says 23. Juli 2014

Hallo Jan,
wie stelle ich es eigentlich an, wenn ich Inhalte von einer Subdomain auf eine andere, externe Domain „weiterleiten“ will?

Also z.b. von:
subdomain.domain1.de nach domain2.info

Hast Du da ein Tipp für mich?

Reply
    Jan says 7. September 2014

    Hi
    ich würde das wie folgt probieren:
    RewriteCond %{HTTP_HOST} ^SUBDOMAIN\.DOMAIN1\.de$ [NC]
    RewriteRule ^(.*) http://DOMAIN2.de/$1 [L,R=301]

    Reply
alfred banze says 29. August 2014

hallo, ich möchte per .htaccess umleiten von
http://www.meineseite.de/projekte/werkstatt.php?w=0&p=0 zu
http://www.meineseite.de/wordpress/tanzwerkstatt

was muss ich tun? DANKE!!

Reply
    Jan says 7. September 2014

    Hi
    soll nur von dieser einen Unterseite inkl. Parameter auf diese eine neue Unterseite geleitet werden? Oder verschiedene URLs nach einem bestimmten Muster?

    Reply
Rrnd says 26. September 2014

Hi,
habe mir 5 verschiedene Domains reserviert (wikingershirts.com, viking-shirts.com, …) die alle auf meine Seite http://www.wikingershirts.de umgeleitet werden (per htaccess).
Das funktioniert auch einwandfrei…
Benötige ich bei den umgeleiteten Domains eigentlich noch eine index.html?

Dnke vorab und viele Grüße,

Arnd

Reply
    Jan says 22. Dezember 2014

    Nein, da über diese Domains ja keinerlei Inhalte erreichbar sein sollen, ist eine index.html nicht notwendig.

    Reply
Ludwig says 15. November 2014

Hallo,
in meinem Projekt ist durch eine Fehlfunktion ein falsches Unterverzeichnis mit in der URL gelandet und indiziert worden.

http://www.meine-Domain.de/falsches_Unterverzeichnis/richtiges_Produkt_12345.html

Der Bereich „falsches_Unterverzeichnis“ soll aus der URL entfernt werden.

Ich benötige eine Umleitung die das komplette Unterverzeichnis eleminiert wobei der Bereich „richtiges_Produkt“ dynamisch ist und den Header 301 mitgibt.

http://www.meine-Domain.de/richtiges_Produkt_12345.html

Reply
    Jan says 17. November 2014

    Hallo Ludwig,

    das würde ich wiefolgt probieren:
    RedirectMatch 301 /falsches_Unterverzeichnis/ /$1

    Reply
Benjamin says 21. Dezember 2014

Hallo, wie lautet der .htaccess Code für Folgendes?

1. https://www.xy.net -> https://www.xy.net/Mobile/
2. https://www.xy.net/Mobile/ -> https://www.xy.net/

1. Von Normal zu Mobile (Automatisch sobald man drauf kommt)
2. Von Mobile zu Normal (Mann klickt einen Link an)

Danke

Reply
    Jan says 21. September 2015

    Ich denke das was du möchtest geht nicht. Wenn du einmal per htaccess eine URL (zb. http://www.xy.net/) auf eine andere URL umleiten lässt, dann lässt diese sich nicht mehr aufrufen, auch wenn du intern verlinkst (denn genau das möchte man ja meist erreichen).

    Wenn du eine Weiterleitung haben willst, die bei erstem Aufruf umleitet, später aber nicht mehr, dann würde ich mich mal mit einem Entwickler unterhalten. Hier musst du vermutlich mit Cookies arbeiten und je nach Cookie-Status entscheiden welche Seite ausgegeben wird.

    Reply
Add Your Reply