Hauptmenü

Untermenü

.htaccess - mod_rewrite Teil 3

1. Die Abschnitte

2. Die Sache mit den Paramatern

Nehmen wir mal folgende Situation an. Wir haben einen Link à la index.php?main=blubb&sub=blubber. Und aus dem wollen wir nun ein blubb/blubber.htm machen. Dazu schauen wir uns zunächst mal den Code aus der index.php im Ordner mod_rewrite_3 an.


<?php 
  print_r($_GET);
  echo '<br /><a href="blubb/blubber.htm?id=1">Bla</a>
        <a href="bla/laber.htm?id=2">Blubb</a>'?>

Ein Hinweis. Das print_r($_GET); dient hier nur zur Überprüfung der entsprechenden Parameter mit ihren Werten. Und was die Sache mit den Links angeht, so habe ich das schon im vorherigen Abschnitt erläutert. Das ist die Ausgabe, nicht der "tatsächliche" Link.

3. Die Regel


RewriteEngine on RewriteRule ^(.*)/(.*)\.htm$ index.php?main=$1&sub=$2

Erläuterung

Das Prinzip habt ihr ja schon im vorherigen Abschnitt kennen gelernt. Hier wird es nur erweitert und angepasst. Wir haben also einen Link mit zwei Parametern, also index.php?main=$1&sub=$2, oder umgeschrieben zum Beispiel blubb/blubber.htm. Deren Werte werden durch die beiden "Variablen" $1 und $2 repräsentiert. Das erste (.*) steht also für $1 und das zweite dann entsprechend für $2.

Ein Hinweis

Bei echten Links sollte man wegen der Validität das & immer (X)HTML-konform umwandeln zu &amp;. In einer .htaccess dagegen rate ich von dieser Vorgehensweise tunlichst ab. Warum? Probiert es aus.

4. Aber!

Wenn ihr jetzt im mod_rewrite_3 die index.php aufruft und auf einem Link klickt, so ist noch alles Ordnung. Bis, ja genau, bis ihr das noch mal macht. Denn dann wird die URL länger und immer länger. Dasselbe gilt auch für den GET-Parameter main. Das liegt daran, dass der Client aus den relativen Pfaden immer eine komplette URL bastelt. Und dann passiert halt so was.

Die Lösung

Auch wenn ich kein Freund von absoluten Verlinkungen bin, so geht es hier nicht anders. Man muss den kompletten Pfad angeben. Die Domain kann man dabei weglassen. Also zum Beispiel mit einer Konstanten.


define('BASEDIR''/htaccess_Loesung/mod_rewrite_3/');
print_r($_GET);
echo '<br />
      <a href="'.BASEDIR.'blubb/blubber.htm?id=1">Blubb Blubber</a>
      <a href="'.BASEDIR.'bla/laber.htm?id=2">Bla Laber</a>'

Noch eine Möglichkeit

... wäre, per HTML das Verzeichnis über das <base>-Tag zu setzen. Allerdings muss hier der komplette Pfad inklusive http:// angegeben werden.


<base href="http://localhost/htaccess_Loesung/mod_rewrite_3/">

5. Fehlt da nicht noch was?

Schaut euch mal die Ausgabe von print_r($_GET); genau an. Und dann betrachtet die beiden Links. Denn bei denen wird am Ende der URL noch ein ?id= angehängt. Und genau das fehlt. Um das Problem zu beseitigen, muss an unsere Regel ein [QSA] angehängt werden. Das ist ein zusätzlicher Parameter, von denen es einige gibt und steht für Query String Append. Damit werden dann alle zusätzlichen GET-Werte im Link übermittelt. Die korrekte Lösung sieht also so aus..


RewriteRule ^(.*)/(.*)\.htm$ index.php?main=$1&sub=$2 [QSA]

zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt