.htaccess - mod_rewrite Teil 3
1. Die Abschnitte
- Einführung
- mod_rewrite Teil 1
- mod_rewrite Teil 2
- mod_rewrite Teil 3
- mod_rewrite Teil 4
- Weiterleitungen
- Aussperren Teil 1
- Aussperren Teil 2
- Zugriffsschutz Teil 1
- Zugriffsschutz Teil 2
- PHP-Einstellungen Teil 1
- PHP-Einstellungen Teil 2
- Fazit
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 &
. 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