jobo: Redirect und Servervariablen (urlencoded oder nicht)

Hallo,

in einer .htaccess habe ich notiert:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php?url=$0 [L]

So werden alle Anfragen auf die index.php umgeleitet und die eigentliche request_uri als $_GET["url"] übergeben.

Wenn ich jetzt example.com/abc def&ghi aufrufe, zerschiesst mir das Ampersand ja meine $_GET["url"], bzw. kriege ich nur das, was vor dem Ampersand steht, ist auch klar.

Ich könnte auch auf $_SERVER["REQUEST_URI"] zurück greifen, finde da aber bei o.g. url dann "/abc%20def&ghi". Das Leerzeichen wird dann also automatisch offenbar vom FF umkodiert in %20, obwohl ich in der Adresszeile "abc def&ghi" stehen habe. $_SERVER["REDIRECT_URL"] ist übrigens auch "/abc def&ghi" (ohne das %20).

Da ich das mit dem Menü (da steht dann als href="abc def&ghi") bzw. mit einem Switch (zur Anzeige des richtigen Inhaltes) abgleiche, wäre die Frage, ob ich urldecode($_SERVER["REQUEST_URI"]) nutzen sollte? Oder gibt es sonst noch Fallstricke, die zu bedenken wären?

Gruß

jobo

  1. Tach!

    Wenn ich jetzt example.com/abc def&ghi aufrufe, zerschiesst mir das Ampersand ja meine $_GET["url"], bzw. kriege ich nur das, was vor dem Ampersand steht, ist auch klar.

    Jein, man kann in PHP konfigurieren, welche Zeichen als Parametertrenner genommen werden sollen: arg-separator.input. Geht aber nur vor dem Scriptstart, also nicht mehr mit iniset().

    Ich könnte auch auf $_SERVER["REQUEST_URI"] zurück greifen, finde da aber bei o.g. url dann "/abc%20def&ghi". Das Leerzeichen wird dann also automatisch offenbar vom FF umkodiert in %20, obwohl ich in der Adresszeile "abc def&ghi" stehen habe.

    Das muss so, weil bei HTTP das Leerzeichen eine andere Bedeutung hat:

    GET url HTTP/1.0

    Ein Leerzeichen in der URL würde selbige beenden.

    $_SERVER["REDIRECT_URL"] ist übrigens auch "/abc def&ghi" (ohne das %20).

    Ja, das macht PHP für dich wieder raus. Genauer gesagt macht es ein urldecode().

    Da ich das mit dem Menü (da steht dann als href="abc def&ghi") bzw. mit einem Switch (zur Anzeige des richtigen Inhaltes) abgleiche, wäre die Frage, ob ich urldecode($_SERVER["REQUEST_URI"]) nutzen sollte? Oder gibt es sonst noch Fallstricke, die zu bedenken wären?

    Das & ist in HTML ein Sonderzeichen und muss als & geschrieben werden. Browser sind jedoch fehlertolerant und lassen das so durchgehen. Wenn es aber kein Parametertrenner sein soll, wäre es günstig, wenn du es, wie alle über die URL zu transportierenden Daten, url-kodieren würdest.

    dedlfix.

    1. Hallo,

      Da ich das mit dem Menü (da steht dann als href="abc def&ghi") bzw. mit einem Switch (zur Anzeige des richtigen Inhaltes) abgleiche, wäre die Frage, ob ich urldecode($_SERVER["REQUEST_URI"]) nutzen sollte? Oder gibt es sonst noch Fallstricke, die zu bedenken wären?

      Das & ist in HTML ein Sonderzeichen und muss als & geschrieben werden. Browser sind jedoch fehlertolerant und lassen das so durchgehen. Wenn es aber kein Parametertrenner sein soll, wäre es günstig, wenn du es, wie alle über die URL zu transportierenden Daten, url-kodieren würdest.

      abc+def%26ghi

      macht Sinn ...;

      Gruß

      jobo

  2. Hi,

    RewriteRule (.*) index.php?url=$0 [L]

    Wenn ich jetzt example.com/abc def&ghi aufrufe, zerschiesst mir das Ampersand ja meine $_GET["url"], bzw. kriege ich nur das, was vor dem Ampersand steht, ist auch klar.

    http://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_b

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
  3. hi,

    RewriteRule (.*) index.php?url=$0 [L]

    So werden alle Anfragen auf die index.php umgeleitet und die eigentliche request_uri als $_GET["url"] übergeben.

    Frag in index.php den REQUEST_URI ab, dann brauchst Du keine Übergabe, und hast keine konfigurationsbedingten Parameter, die Du sonst _immer_ beachten müsstest, wenn Dein REQUEST_URI selbst Parameter hat.

    Hotti