GrandmasterA: mod_rewrite mit beliebigen Variablen

Hallo zusammen,

ich hab jetzt schon ´ne Weile zum Thema mod_rewrite gegooglet. Leider finde ich nicht das passende, daher frag ich jetzt einfach mal hier.

Ich möchte gern meine URLs mit mod_rewrite folgendermaßen darstellen...

Aus www.meineseite.de/page.php?variable1=wert1&variable2=wert2&variable3=wert3

soll www.meineseite.de/page/variable1/wert1/variable2/wert2/variable3/wert3 werden...

Und zwar völlig unabhängig von der Reihenfolge der Variablen... das erste ist immer die Bezeichnung, danach der Wert, dann die nächste Bezeichnung und deren Wert usw.

Irgendwie finde ich nur Lösungen, bei denen man fest in der .htaccess-Datei angeben muss, welche Variable an welcher Stelle kommt:
www.meineseite.de/wert1/wert2/wert3

Aber das, was ich möchte, geht doch sicherlich auch... oder nicht?

Bin für jeden Tipp dankbar.

Gruß,
Andreas

  1. Lieber GrandmasterA,

    ich wundere mich über die Reihenfolge... Ich hätte jetzt erwartet, dass ein Request mit der URL

    www.meineseite.de/page/variable1/wert1/variable2/wert2/variable3/wert3

    per mod_rewrite

    www.meineseite.de/page.php?variable1=wert1&variable2=wert2&variable3=wert3

    werden soll.

    Aber umgekehrt...? Warum soll das bei Dir gerade umgekehrt gemacht werden?

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. OK, vielleicht drücke ich mich nur falschrum aus...  ;)

      Natürlich soll es so sein, wie Du es meinst (für den Server)... mit Umwandeln meine ich "für den Nutzer sichtbar"...

      Im Moment stelle ich meine URLs noch so dar:
      www.meineseite.de/page.php?variable1=wert1&variable2=wert2&variable3=wert3

      Das will ich ändern... und dann natürlich mit mod_rewrite für den Server wieder umwandeln. So gesehen hast Du natürlich recht.

      Gruß,
      Andreas

      1. Lieber GrandmasterA,

        dann must Du mit Klammern arbeiten. Den URL musst Du anhand der Slashes auftrennen, um dann die Referenzen auf das Geklammerte jeweils wieder zusammenzubauen.

        Drei Werte in drei Variablen? OK. Mal sehen. Folgender Code ist ungeprüft!

        RewriteRule ^/?([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/?$ page.php?$1=$2&$3=$4&$5=$6 [QSA]

        Wenn die URL tatsächlich die von Dir vorgeschlagene Struktur hat (also mit sechs Verzeichnissen, bzw. fünf Verzeichnissen und einer Datei), dann sollte dieser Ausdruck matchen. Aber ich bin etwas überfragt, was man machen soll, wenn weniger Parameter angefordert werden...

        Liebe Grüße,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
      2. Im Moment stelle ich meine URLs noch so dar:
        www.meineseite.de/page.php?variable1=wert1&variable2=wert2&variable3=wert3

        Wenn du eine unbekannte ANzahl von Variablen hast:

        RewriteRule ^([^/^.]+)$        /index.php?id=$1&p[]=$1   [L,NE,QSA]
        RewriteRule ^(.+)/([^/]+)$      /$1?p[]=$2                [L,NE,QSA]

        Wird umgeschrieben auf die index.php und alle Variablen stehen dann im Array p[]

        1. Nachtrag:

          Wird umgeschrieben auf die index.php und alle Variablen stehen dann im Array p[]

          Die erste Variable liegt dann in $_GET['id']
          Ich habs nur bei mir rauskopiert und das glatt übersehen ;)

          1. Danke...

            Das werde ich dann gleich mal probieren.

  2. echo $begrüßung;

    Aus www.meineseite.de/page.php?variable1=wert1&variable2=wert2&variable3=wert3
    soll www.meineseite.de/page/variable1/wert1/variable2/wert2/variable3/wert3 werden...

    Du möchtest sicherlich eine variable Anzahl an Parametern haben. Dafür ist mod_rewrite nicht sonderlich gut geeignet. Meine Vorgehensweise wäre:

    # Files und Directorys ignorieren
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      # $1 = Seitenname, $2 = Rest
      RewriteRule ^/([^/]*)/(.*)$ $1.php/$2

    Das soll (kann es grad nicht probieren) das page aus deinem Beispiel nach $1 und den Rest nach $2 bringen und page.php/rest aufrufen. Im Script $1.php steht dir $2 in $_SERVER['PATH_INFO'] zur Verfügung, falls dieses Feature im Apachen nicht deaktiviert wurde. Diesen Wert kannst du am / explodieren lassen, ...

    Bin für jeden Tipp dankbar.

    Bitte keine Domainnamen verwenden, die dir nicht gehören. Für Beispiele gibt es extra reservierte Domainnamen, die nicht mit real existierenden Domains kollidieren.

    echo "$verabschiedung $name";

    1. Du möchtest sicherlich eine variable Anzahl an Parametern haben. Dafür ist mod_rewrite nicht sonderlich gut geeignet.

      Was gefällt dir denn an der Lösung nicht, die ich gepostet habe und seit 2 Jahren erfolgreich einsetze? Ich lerne ja immer gerne dazu.

      1. echo $begrüßung;

        Du möchtest sicherlich eine variable Anzahl an Parametern haben. Dafür ist mod_rewrite nicht sonderlich gut geeignet.
        Was gefällt dir denn an der Lösung nicht, die ich gepostet habe und seit 2 Jahren erfolgreich einsetze?

        Ich habe nicht behauptet, sie gefiele mir nicht. Als ich mein Posting absetzte war mir deine Antwort noch nicht bekannt. Aber wenn du mich schon so direkt fragst, hole ich das gern nach: Deine Lösung gefällt mir nicht. Sie löst das Problem des OP nicht. Jedenfalls habe ich es damit nicht gelöst bekommen.

        RewriteRule ^([^/^.]+)$  /index.php?p[]=$1  [L,NE,QSA]

        Diese Regel zieht nur bei einem Wert, der weder / noch ^ noch . enthält.
        example.org/foo ergibt index.php mit $_GET['p'][0] = foo. Von einem solchen Anwendungsfall hat der OP aber gar nicht gesprochen.

        RewriteRule ^(.+)/([^/]+)$  /$1?p[]=$2  [L,NE,QSA]

        Diese Regel passt auch nicht, weil sie keinen ".php"-losen ersten Wert in einen mit .php umschreibt. Ich erlaube mir mal, sie leicht zu verändern, indem ich eine definierte Datei aufrufe und stattdessen $1 als Parameter f übergebe.

        RewriteRule ^(.+)/([^/]+)$  /index.php?f=$1&p[]=$2  [L,NE,QSA]

        Beim Aufruf mit

        example.org/page/variable1/wert1/variable2/wert2/variable3/wert3

        erhalte ich

        $_GET['f'] = page/variable1/wert1/variable2/wert2/variable3
          $_GET['p'][0] = wert3

        So war das auch nicht gewünscht.

        Für welches Problem oder welche Aufgabenstellung verwendest du eigentlich das Flag NE?

        echo "$verabschiedung $name";

        1. Für welches Problem oder welche Aufgabenstellung verwendest du eigentlich das Flag NE?

          Ganz ehrlich? Ich hab keine Ahnung. Ich habe diese Lösung in einer FAQ gefunden und dachte, sie könnte dem OP helfen.
          Ich bin in Punkto mod_rewrite ein ziemlicher Noob und behelfe mich mit Google und dessen Ergebnissen ;)
          Was das NE jetzt bewirkt, müsste ich erstmal nachlesen und dann analysieren, was es in meinem Anwendungsfall macht (wenn es überhaupt was macht)