Der Martin: mod_rewrite und URL-Parameter auswerten

Beitrag lesen

N'Abend Leute,

ich bin heute auf ein für mich nicht nachvollziehbares Problem beim URL-Rewriting im Zusammenhang mit URL-Parametern gestoßen.

Gegeben sei ein Apache 2.049 mit PHP 5.0.1 als Modul, das Gespann läuft unter Win2kSP4. In einem Verzeichnis unterhalb vom DocRoot liegt ein PHP-Script; die Datei heißt index.php und liefert abhängig von einem URL-Parameter page=xyz unterschiedliche Seiten aus. Auch das Erkennen und Verarbeiten weiterer URL-Parameter außer page= macht mir keine Schwierigkeiten.

Nun wollte ich aber "schönere" URLs haben; deswegen habe ich mich zum ersten Mal ernsthaft mit mod_rewrite befasst. Langsam einsteigen, nichts überstürzen, dachte ich. Also wollte ich im ersten Schritt z.B. abbilden:
 /relaunch/start    auf   /relaunch/index.php?page=start
 /relaunch/aktuell  auf   /relaunch/index.php?page=aktuell
Dazu habe ich in /relaunch/.htaccess folgendes notiert:

RewriteEngine on
  RewriteBase /relaunch
  RewriteRule ^start$            index.php?page=start
  RewriteRule ^aktuell$          index.php?page=aktuell

Das funktioniert auch so, wie ich es erwarte. Deshalb bin ich einen Schritt weiter gegangen und habe ergänzt:

RewriteRule ^kontakt?(.*)$    index.php?page=kontakt&$1

Meiner Ansicht nach müsste der Aufruf von kontakt?name=blah nun auf die URL index.php?page=kontakt&name=blah abgebildet werden.
Seltsamerweise enthält $_GET aber nun nur _einen_ Eintrag, nämlich $GET['page']='kontakt'. Der zweite URL-Parameter fällt unter den Tisch. Das passt zusammen mit der Beobachtung, dass $_SERVER['QUERY_STRING']='page=kontakt' ist (mit print_r() ermittelt). Gleichzeitig ist aber $_SERVER['REQUEST_URI']='relaunch/kontakt?call=blah'. Doch warum taucht der Parameter nicht im $_GET-Array auf? Welche URL parst PHP nun eigentlich, die ursprüngliche oder die mit mod_rewrite veränderte? Die Einträge in $_SERVER deuten einen ziemlichen Mischmasch an.

Ich blick da nicht so richtig durch - wer mag mir helfen?

So long,
 Martin

--
Ich wollt', ich wär ein Teppich. Dann könnte ich morgens liegenbleiben.