Till: [mod_rewrite] Problem mit Variablenübergabe

Hallo!

Ich finde einfach nicht, woran es liegen könnte ... Vielleicht hat ja jemand eine Idee. Vielen Dank schon einmal.

Ich habe die folgenden beiden Rewrite-Regeln aufgestellt. Die erste funktioniert erwartungsgemäß, bei der zweiten wird immer "index" als $1/page-Parameter übergeben.

RewriteRule ^([a-zA-Z0-9-_]*).html$ index.php?page=$1&end=html [L]
RewriteRule ^([a-zA-Z0-9-_]*).php$ index.php?page=$1&end=php [L]

Die Übergabeparameter frage ich in der index.php mit $_GET['page'] und $_GET['end'] ab. $_SERVER['REDIRECT_QUERY_STRING'] liefert korrekt "page=seite12&end=php".

Für www.test.test/foo.html erhalte ich foo und html,
für www.test.test/foo.php  erhalte ich index und php.

Woran könnte das bloss liegen?

Grüe, Till

  1. echo $begrüßung;

    RewriteRule ^([a-zA-Z0-9-_]*).php$ index.php?page=$1&end=php [L]
    für www.test.test/foo.php  erhalte ich index und php.

    Woran könnte das bloss liegen?

    mod_rewrite stellt aufgrund der internen Arbeitsweise des Apachen einen weiteren Request mit dem umgeschriebenen Ergebnis. Dieser Request durchläuft ebenfalls die Per-Verzeichnis-Konfigurationsanweisungen, also auch deine RewriteRules. Es wird also erneut umgeschrieben und das Spiel geht von vorn los. Diesmal dürfte aber mod_rewrite bemerkt haben, dass es schon mal umgeschrieben hat und es nun ignorieren, was aber schon zu spät ist. Den genauen Ablauf erfährst du, wenn du dir das RewriteLog anschaust, falls du darauf Zugriff hast und es eingeschaltet wurde.

    Abhelfen kannst du dir mit zwei RewriteCond(itions), die nur dann ein Umschreiben zulassen, wenn der Request auf keine existierende Datei und kein existierendes Verzeichnis passt.

    RewriteCond  %{REQUEST_FILENAME} !-d
    RewriteCond  %{REQUEST_FILENAME} !-f
    RewriteRule ^([a-zA-Z0-9-_]*).php$ index.php?page=$1&end=php [L]

    Die RewriteCond ebenfalls für deine .html-RewriteRule zu verwenden ist sicher auch keine schlechte Idee.

    echo "$verabschiedung $name";

    1. Hallo dedlfix,

      mod_rewrite stellt aufgrund der internen Arbeitsweise des Apachen einen weiteren Request mit dem umgeschriebenen Ergebnis. Dieser Request durchläuft ebenfalls die Per-Verzeichnis-Konfigurationsanweisungen, also auch deine RewriteRules. Es wird also erneut umgeschrieben und das Spiel geht von vorn los. Diesmal dürfte aber mod_rewrite bemerkt haben, dass es schon mal umgeschrieben hat und es nun ignorieren, was aber schon zu spät ist. Den genauen Ablauf erfährst du, wenn du dir das RewriteLog anschaust, falls du darauf Zugriff hast und es eingeschaltet wurde.

      Heilig's Blechle!!! Das macht Sinn. Wäre ich wohl nie drauf gekommen ...

      Abhelfen kannst du dir mit zwei RewriteCond(itions), die nur dann ein Umschreiben zulassen, wenn der Request auf keine existierende Datei und kein existierendes Verzeichnis passt.

      RewriteCond  %{REQUEST_FILENAME} !-d
      RewriteCond  %{REQUEST_FILENAME} !-f
      RewriteRule ^([a-zA-Z0-9-_]*).php$ index.php?page=$1&end=php [L]

      Jetzt funktionieren auch meine ursprünglichen Regeln:

      RewriteRule ^([a-zA-Z0-9-_]*).(html|php|htm|xhtml)$ index.php?page=$1&end=$2 [L]
      RewriteRule ^([a-zA-Z0-9-_]*) index.php?page=$1 [L]

      Nur beim Aufruf von "index.php" bzw. der Domain ohne Datei- oder sonstiger Angabe sind die Parmeter jetzt ja trotzdem noch leer. Das ist nicht 100% optimal, läßt sich im Skript aber abfangen ...

      1000 Dank!

      Grüße, Till