Startseite arrow Tipps & Tricks arrow .htaccess und modRewrite - Praktische Beispiele

.htaccess und modRewrite - Praktische Beispiele

(2 Bewertungen)
Donnerstag, 3. Juli 2008
Geschrieben von Armin Vieweg
.htaccess ist ein mächtiges und sehr umfangreiches Werkzeug. Hier möchte ich ein paar praktische Anwendungsbeispiele mit Erklärung bereitstellen.

Jedes mal wenn der Browser eine Datei auf einem Webserver anfordert (diesen Vorgang nennt man HTTP-Request) wird bei Apache-Servern nach einer sogenannten .htaccess-Datei gesucht.

Darin stehen verschiedene Dinge, die den Aufruf der Internetseite manipulieren können.



Weiterleitungen
Über die .htaccess-Datei können wir eine Weiterleitung von einer Domain zur nächsten veranlassen. Gebe ich also beispielsweise www.domain.com ein werde ich auf domain.de weitergeleitet. Das schöne ist, dass wenn ich domain.com/impressum.html eingebe wird der Aufruf des Impressums mit übermittelt und ich erhalte die Seite domain.de/impressum.html.

Über .htaccess können wir noch sagen was es für eine Weiterleitung sein soll. Google beispielsweise benutzt diese Angabe für die Indexieren der Internetseiten.

Eine 301-Weiterleitung ist beispielsweise permanent und Google weiß, dass er die Links im Index entsprechend ändern muss, eine 302-Weiterleitung teilt Google mit, dass die Seite nur temporär umgeleitet wird.


Innerhalb der htaccess-Datei steht dann beispielsweise:

Redirect 301 / http://www.neue-domain.de/


Wir können die Weiterleitung auch auf bestimmte Ordner beschränken:

Redirect 302 /login/ http://www.neue-domain.de/kundenlogin/


Hier wird die Weiterleitung nur dann durchgeführt, wenn man auf den Ordner Login zugreifen möchte. Und durch den Code 302 wird gesagt: Die Weiterleitung ist nur temporär.



Mit und ohne www
Wir wissen, dass Google die Seite www.domain.de und domain.de als zwei unterschiedliche Seiten betrachtet. Um zu verhindern, dass dies als doppelter Content erkannt wird sollte man nur einen der beiden Varianten verwenden. Also entweder mit oder ohne www.

Meist verwendet man die Internetseite mit www. in diesem Fall können wir folgenden Code in die htaccess-Datei einfügen:

rewritecond %{http_host} !^www\.
rewriterule ^(.*)$ http://www.domain.de/ [r=301]


Darin steht praktisch folgende Aussage: Wenn die URL nicht mit www. beginnt, leite weiter auf die Seite www.domain.de.


Zu einer Datei leiten
Auf meiner Arbeit erstellen wir Internetseiten immer so, dass das eigentliche root in einem Unterverzeichnis liegt. Die URL zur Startseite sieht also so aus: www.domain.de/de/index.php

Wir brauchen jetzt also eine Weiterleitung von der Eingabe der Domain zu dieser Datei. Und auch diese Weiterleitung löst man am besten mit htaccess (auch wenn HTML oder PHP ebenfalls Möglichkeiten bieten).

rewritecond %{REQUEST_URI} ^/$
rewriterule ^(.*)$ http://www.domain.de/de/index.php [r=301]


Diese Regel besagt also, dass wenn hinter dem Domain-Namen nichts mehr folgt soll auf die Seite /de/index.php weitergeleitet werden.


Mit und ohne www zu einer Datei leiten
So und nun die Kombination aus den beiden vorherigen Anwendungsbeispielen:

rewritecond %{REQUEST_URI} ^/$
rewriterule ^(.*)$ http://www.domain.de/de/index.php [r=301,L]

rewritecond %{http_host} !^www\.
rewriterule ^(.*)$ http://www.domain.de/ [r=301]



Aufmerksamen Beobachtern ist vermutlich das [r=301,L] aufgefallen in der ersten Rewriterule. Das müssen wir schreiben, denn ansonsten funktioniert es nicht. Spielen wir doch mal verschiedene Szenarien durch:

Ich gebe ein www.domain.de. Die erste Regel wäre damit erfüllt und er würde mich auf /de/index.php Weiterleiten. Wir haben ein www. drin, von daher bleibt die 2. Regel unberührt. Alles ok!

Ich gebe ein domain.de/de/index.php. Die erste Regel greift nicht, denn es steht ja etwas hinter der Domain, aber diesmal kommt die 2. Regel zum Einsatz, denn wir haben kein www. davor geschrieben. Also werde ich auf www.domain.de/de/index.php weitergeleitet. Auch hier alles wunderbar!

Ich gebe ein domain.de. Und jetzt gäbe es einen Fehler, wenn wir nicht das ,L darin stehen hätten. Denn jetzt sind beide Regeln aktiv. Ich habe nichts hinter der Domain stehen und es fehlt das www. Der Server würde uns ohne das ,L versuchen auf folgende Adresse zu leiten: http://www.domain.de/http://www.domain.de/de/index.php mit mäßigem Ergebnis versteht sich.

Das ,L (steht für Last und) sorgt dafür, dass wenn diese Regel ausgeführt wird, keine weitere mehr zum Einsatz kommt. Zumindest nicht für diesen HTTP-Request. Es wäre dann also die letzte Regel die ausgeführt wird (last).



Uff... htaccess ist ein Thema für sich
Ja, das Thema htaccess kann ganze Bücher mit Inhalten füllen. Aber ich denke die hier erwähnten Anwendungsbeispiele dürften 70% der regelmäßigen Arbeit mit htaccess decken. Auf der neuen Professor Web Website möchte ich etwas näher darauf eingehen und einen kleinen Workshop der htaccess-Datei widmen. Bis dahin hoffe ich aber, dass dieser Beitrag Euch ein wenig weiterhelfen kann.


  Kommentare (16)
 1 Geschrieben von: Michael, am 19.12.2008 um 09:09
Sollte durch welchen Grund auch immer, eine Verwendung von htaccess ausgeschlossen sein, kann man per PHP-Header von domain.de auf www.domain.de weiterleiten. 
 
Der folgende Code muss den restlichen Code anführen sprich in der 1. Zeile stehen: 
 
if (strpos($_SERVER['HTTP_HOST'], 'www.') != 0) {  
header('Location: http://www.'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']); 
die(); 

 
 
WICHTIG, ... 
dafür das die PHP-Funktionen unterstützt wird.
 2 Geschrieben von: Matthias, am 19.12.2008 um 09:08
Als Ergänzung zu Michaels Code: 
Wenn ich mich jetzt nicht völlig irre, wird bei dieser Weiterleitung als Standard der Status "302 Found" gesendet, also ein Hinweis, dass die aufgerufene Seite temporär unter einer anderen URI zu finden ist. 
Besser ist es, einen 301-Status vorab zu senden, damit zukünftig immer die gewünschte Adresse verwendet wird. 
 
Also folgende Zeile vor die Weiterleitung setzen: 
header("HTTP/1.1 301 Moved Permanently"); 
 
Gleiches kann man verwenden, wenn man z.B. einmal die Struktur seiner Seite verändert. Ich habe erst kürzlich von dynamischen Links per Mod_Rewrite auf statische umgestellt und damit z.B. Google die PageRank-Informationen übernimmt, ist diese Art der Weiterleitung sinnvoll.
 3 Geschrieben von: Kalea, am 27.07.2008 um 16:33
Tausend Dank für die Erklärung!!!War die einfache Idee schlechthin mit Redirect zur Startseite (hat eigene Loginfunktion),mein Copperminegalerieverzeichnis komplett zu schützen, ohne innerhalb der Seite ständig die Passwortabfrage von htaccess zu bekommen. 
So einfach eigentlich...statt kompliziert zu versuchen die bereits gesetzten cookies oder session-ids auszulesen. 
Für meinen Fall reicht das völlig so.
 4 Geschrieben von: Paul, am 20.01.2009 um 07:03
Wenn ich folgendes eintrage  
 
rewritecond %{REQUEST_URI} ^/$ 
rewriterule ^(.*)$ http://www.domain.de/de/index.php [r=301,L] 
 
rewritecond %{http_host} !^www\. 
rewriterule ^(.*)$ http://www.domain.de/ [r=301] 
 
und mich im Admin der Seite Anmelden möchte, werde ich immer wieder zur Domain.tdl/index.php geleitet. Ein login in den Admin ist damit nicht mehr möglich. 
 
Liegt das evtl daran das der Admin keine .htaccess beinhaltet? 
 
Grüße 
Paul
 5 Geschrieben von: Paul, am 20.01.2009 um 07:09
Ups 
 
rewritecond %{REQUEST_URI} ^/$ 
rewriterule ^(.*)$ http://www.domain.de/index.php [r=301,L] 
 
rewritecond %{http_host} !^www\\. 
rewriterule ^(.*)$ http://www.domain.de/index.php [r=301] 
 
so war es gemeint
 6 Geschrieben von: Armin Vieweg, am 20.01.2009 um 08:08
Hallo Paul, 
 
der doppelte Backslash im 2. Rewritecond ist zu viel. Oben hattest Du es richtig geschrieben. Eigentlich müsste der Code genau so funktionieren. 
 
Da er es aber wohl offensichtlich nicht tut, schlage ich vor Du schreibst mir eine E-Mail (Link zu Kontakt findest Du im Footer) mit dem kompletten Code der .htaccess-Datei und ggf. dem Link der Seite, damit ich sehen kann wie sich das Problem auswirkt. 
 
Gruß 
Armin
 7 Geschrieben von: Hartmut, am 30.03.2009 um 21:30
Hallo, 
ich beschäftige mich gerade mit diesem Thema (seit gestern) und wüsste da gerne was grundsätzliches:  
Sind beide Domain auf das gleiche Verzeichnis geschaltet und dort kommt dann auch die .htaccess rein? 
Oder sind die Domain jeweils auf ein eigenes Verzeichnis geschaltet und es wird von einem Verzeichnis zum anderen geleitet? 
 
Außerdem habe ich 4 Domain die ich auf eine 5te weiterleiten möchte mit 301-Weiterleitung und zusätzlich grundsätzlich auf www um alle Eventualitäten bei Google auszuschließen. 
 
Ich habe aber keine Ahnung von dem Code und bin mir unsicher den für mich aus diesen Beispielen hier richtig zusammen zu stricken. 
 
Könnte/würde mir da jemand freundlicherweise weiterhelfen? 
 
Gruß 
Hartmut
 8 Geschrieben von: Armin Vieweg, am 30.03.2009 um 21:35
Hallo Hartmut, 
 
Deine erste Vermutung war richtig. Alle Domains zeigen auf das gleiche Verzeichnis, darin liegt eine .htaccess Datei in der steht "wenn der aufruf nicht von domain.de kam, dann leite auf domain.de per 301 Weiterleitung". 
 
Wenn Du also jetzt website.de und homepage.de hast und die darauf leiten werden sie beide auf domain.de weitergeleitet, weil das ja so im htaccess steht. 
 
Dein Code dafür sähe so aus: 
rewritecond %{http_host} !^www\.domain\.de 
rewriterule ^(.*)$ http://www.domain.de/ [r=301] 
 
Damit hast Du das www und die 5. Domain abgedeckt :) 
 
Gruß 
Armin
 9 Geschrieben von: Hartmut, am 30.03.2009 um 22:07
Hallo Armin, 
 
danke für die schnelle Antwort. Aber ich muss da noch mal nachhaken, die 4 Domains müssen doch einzeln im Code aufgeführt werden? Habe wir uns missverstanden (ich mich falsch ausgedrückt)? 
 
domain1.de + domain2.de + domain.at + domain.ch weiterleiten auf www.domain.eu 
 
Spielt es dabei eine Rolle ob die Anfrage mit oder ohne www kommt? 
Also www. domain.de + domain.de werden wohl gleichsam weitergeleitet? 
 
Letztendlich soll alles bei www.domain.eu landen. 
 
Gruß 
Hartmut
 10 Geschrieben von: Armin Vieweg, am 30.03.2009 um 22:15
Hallo Hartmut, 
 
das ist das Tolle an htacces. Der einfachste Weg funktioniert. 
 
Du willst das alle Anfragen auf www.domain.eu landen. Also was stellt man für eine Abfrage? Wenn es NICHT www.domain.eu ist, soll es auf www.domain.eu weiterleiten. Das klappt natürlich nur dann, wenn alle 5 Domains von dieser htaccess Datei behandelt werden. Dann wird geschaut: "ahhh die Anfrage kam von domain1.de ... das ist nicht www.domain.eu, also leite dorthin". 
 
Oder es kommt die Anfrage: "Die Anfrage lautet domain.eu... das ist aber nicht www.domain.eu, also leite ich darauf weiter". Im besten Fall kommt die Anfrage www.domain.eu, dann passiert nichts, weil wir sind ja schon dort wo wir hin wollten. 
 
Natürlich kannst Du auch jede einzelne Domain anfragen und sagen: Wenn Domain1 dann das, wenn Domain2, dann das... aber so ist es doch viel eleganter :) 
 
Sinnbildlich könnte man diese htaccess Regel auch so beschreiben: "Wenn Du NICHT am Ziel bist, gehe zum Ziel". Also ganz einfach :) 
 
Gruß 
Armin
 11 Geschrieben von: Hartmut, am 30.03.2009 um 22:37
Hallo Armin, 
 
ja klingt logisch, mein gedanklicher Aussetzer war, dass wir ja in ein und demselben Verzeichnis sind und die Anfragen ja nur eine der 5 Domain in jeglicher Form betreffen kann. 
(manchmal sieht man den Wald vor lauter Bäumen nicht) 
 
Was mich noch irritiert hat, ist das in dem Code in der 1ten Zeile "de" steht, es aber auch Anfragen an .at und .ch kommen. 
 
rewritecond %{http_host} !^www\.domain\.de 
 
Die 2te Zeile muss dann ja entsprechend meiner Domain .eu sein 
 
rewriterule ^(.*)$ http://www.domain.eu/ [r=301] 
 
Gruß 
Hartmut
 12 Geschrieben von: Armin Vieweg, am 30.03.2009 um 22:43
Hallo Hartmut, 
 
deine zwei Zeilen müssen so aussehen: 
 
rewritecond %{http_host} !^www\.domain\.eu 
rewriterule ^(.*)$ http://www.domain.eu/ [r=301] 
 
Das Ausrufezeichen vor der Domain heißt: "Wenn der Host NICHT www.domain.eu ist" 
und die Regel besagt: "Gehe in diesem Fall auf www.domain.eu". 
 
In beiden Zeilen muss also das Gleiche stehen. Die Punkte müssen aber mit einem Backslash versehen werden, da diese sonst als regulärer Ausdruck gelten und ein Punkt steht dort für ein beliebiges Zeichen. Ein \. steht für einen reelen Punkt. Kopier diese zwei Zeilen in die htaccess Datei und es wird funktionieren.  
 
Darüber sollte aber noch ein : RewriteEngine on stehen. Könnte sein, dass das htaccess sonst nicht ausgeführt wird. 
 
Gruß 
Armin
 13 Geschrieben von: Hartmut, am 30.03.2009 um 22:54
Hallo Armin, 
 
Der Groschen fällt Pfennigweise :-) 
Danke! Vielen Dank für die Erklärung und die Hilfe. Habe zwischenzeitlich schon 2 weitere hilfreiche Sachen hier gefunden. Schön, dass es sowas gibt. 
 
Gruß 
Hartmut
 14 Geschrieben von: Micha, am 23.09.2009 um 17:04
Hallo, 
 
ich hab da mal ne Frage: 
 
Ich habe ein Strato-Paket mit mehreren Domain und auch mehreren Inhalten: 
 
Wie kann ich folgende Weiterleitung realisieren: 
 
www.domain1.de -> www.domain.de/folder1 
www.domain2.de -> www.domain.de/folder2 
www.domain.de -> www.domain.de/folder3 
 
und jetzt das Schmankerl, da bisher als redirect augeführt und in Google und co mit Pfaden indizert: 
 
www.domain.de/folder3 -> domain.de/folder3 (klappt ja nicht mehr, da das root-verzeichnis durch die obige Anweisung ja quasi ein Ordner weiter verschoben wurd. 
 
Danke 
Micha
 15 Geschrieben von: Armin Vieweg, am 24.09.2009 um 06:27
Hi Micha, 
 
ich verstehe Deine Frage leider nicht 100%ig. Vielleicht schickst Du mir nochmal ne Mail mit konkreten angaben. Ich weiß jetzt leider nicht genau, was Du meinst. 
 
Vielen Dank. 
Gruß 
Armin
 16 Geschrieben von: Robert, am 19.01.2010 um 22:33
Hier habe ich geile Infos dazu gefunden: .htaccess Befehle und Optimierung 
Man sollte aber abwägen was man in der htaccess wirklich braucht da auch die Serverauslastung bei der abarbeitung zunimmt.

Kommentar schreiben

Name:


Kommentar:


Letzte Aktualisierung ( Donnerstag, 3. Juli 2008 )
 
Weiter >




Professor Web - Webdesign Blog - RSS-Feed

Professor Web Blogroll

Alternativer Webdesign-Blog
www.daswebdesignblog.de

Blog für Dies und Das
www.moes-blog.de