mod_rewrite: GET-Parameter komplett abändern

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • mod_rewrite: GET-Parameter komplett abändern

    Hi Leute
    Habe die letzten Stunden hier im Forum und im Netz nach einer Antwort gesucht, aber ich bin leider nicht wirklich fündig geworden!
    Ich würde gerne alle meine URL-Query, also alle GET-Parameter umschreiben. Das ganze soll nach folgendem Schema geschehen:
    Code:
    http://www.irgendwo.de/path/to/file.php?id=2&var=bla&foo=bar
    soll umgeschrieben werden in
    Code:
    http://www.irgendwo.de/path/to/file.php/id-2/var-bla/foo-bar/
    bzw. wenn ich den zweiten Link aufrufe, soll dies ein Alias zu dem ersten Link sein.

    Jetzt ist aber nicht sichergestellt, das diese Parameter auch in dieser Reihenfolge oder überhaupt auftreten. Außerdem soll das Rewrite auf jede URL angewendet werden, muss also sehr allgemein gehalten werden. Für einzelne Parameter ist die Lösung ja nicht schwer, doch weiß ich nicht, wie ich bei einer unbekannten Anzahl von Parametern vorgehen soll.

    Im Moment habe ich folgenden Schnipsel in der Config:
    Code:
    # 4 Parameter
    RewriteRule ^/(.*).php/(.*)-(.*)/(.*)-(.*)/(.*)-(.*)/(.*)-(.*)/$ /$1.php?$2=$3&$4=$5&$6=$7&$8=$9
    # 3 Parameter
    RewriteRule ^/(.*).php/(.*)-(.*)/(.*)-(.*)/(.*)-(.*)/$ /$1.php?$2=$3&$4=$5&$6=$7
    # 2 Parameter
    RewriteRule ^/(.*).php/(.*)-(.*)/(.*)-(.*)/$ /$1.php?$2=$3&$4=$5
    # 1 Parameter
    RewriteRule ^/(.*).php/(.*)-(.*)/$ /$1.php?$2=$3
    Leider hört es jetzt bei 4 Parametern schon auf, da es nur 9 Regex-Variablen gibt. Gibt es nicht eine Art Schleife oder ein Flag, mit der ich alle Parameter entsprechend ändern könnte? Oder das ich mehrere einzelne Regeln nacheinander auf die URL anwende, so dass in jeder Regel einige Parameter ersetzt werden?

    Ich bin momentan etwas Ratlos und für jeden Gedankenanstoß und jedes Stichwort dankbar!

  • #2
    Tjo... also ich würde das über Pathinfo lösen~

    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
    Wie man Fragen richtig stellt

    Kommentar


    • #3
      oh ja, slashes sind so viel ästhetischer als ampersands und die minus-zeichen sind geradezu puristisch gegenüber diesen überbewerteten gleichheitszeichen..

      p.s. meine augen tränen, wenn ich die url in diesem forum sehe. deine auch?

      Kommentar


      • #4
        Original geschrieben von penizillin
        oh ja, slashes sind so viel ästhetischer als ampersands und die minus-zeichen sind geradezu puristisch gegenüber diesen überbewerteten gleichheitszeichen..

        p.s. meine augen tränen, wenn ich die url in diesem forum sehe. deine auch?
        Es geht mir hier um keinerlei Ästhetik sondern um meine URLs Suchmaschinen fähig zu machen. Da die Queries in der URL ja meist nicht mitgespeichert werden, ist das natürlich etwas unschön, da ja erst durch die GET-Parameter die korrekte Seite identifiziert werden kann. Aber das ist ja nichts neues was ich hier vorhabe!
        Meinetwegen können es statt den Minuszeichen auch irgendwelche anderen Zeichen sein, die ich auf ein Gleichheitszeichen ändern kann, ein Komma zum Beispiel. Wichtig ist eher, dass die URLs anschließend wie Pfade zu Verzeichnissen aussehen, damit diese korrekt indiziert werden.


        Tjo... also ich würde das über Pathinfo lösen~
        Ich gehe mal davon aus, du meinst AcceptPathInfo von Apache
        Ich kann das jetzt gerade nicht testen, aber ich denke, damit könnte ich mein Problem lösen. Gehe ich richtig in der Annahme, das ich im Skript dann noch die GET-Parameter aus der entsprechenden $_SERVER-Variable extrahieren muss, ähnlich wie ich es mit meiner Regex mache?

        Kommentar


        • #5
          Es geht mir hier um keinerlei Ästhetik sondern um meine URLs Suchmaschinen fähig zu machen.
          kannst du mir erklären, was an "normalen" urls nicht "Suchmaschinen fähig" ist? am besten ohne formulieren wie "aber in einem forum habe ich gelesen, dass..."

          Da die Queries in der URL ja meist nicht mitgespeichert werden...
          und auch diese einsichten in die funktionsweise moderner suchmaschinen würde ich gern belegt sehen.

          Kommentar


          • #6
            Original geschrieben von penizillin
            kannst du mir erklären, was an "normalen" urls nicht "Suchmaschinen fähig" ist? am besten ohne formulieren wie "aber in einem forum habe ich gelesen, dass..."

            und auch diese einsichten in die funktionsweise moderner suchmaschinen würde ich gern belegt sehen.
            Kann ich dir nicht erklären und auch nicht belegen! Wenn du mir sagst, die GET-Parameter werden auch mit erfasst, dann glaube ich es dir gerne.
            Ich habe aber ehrlich gesagt keine Lust, mich mit dir um für und wider zu streiten, sondern würde gerne eure Hilfe in Anspruch nehmen. ghostgambler hat mir auf jeden Fall schon mal einen guten Tipp gegeben, dem ich nachgehen werde! Wenn du mir auch noch einen Tipp geben kannst, ich bin für jede Idee und Hilfe dankbar

            Kommentar


            • #7
              Original geschrieben von PHP-Desaster
              Gehe ich richtig in der Annahme, das ich im Skript dann noch die GET-Parameter aus der entsprechenden $_SERVER-Variable extrahieren muss, ähnlich wie ich es mit meiner Regex mache?
              Ja - in deinem Fall würde ein
              PHP-Code:
              $vars explode('/'$_SERVER['PATH_INFO']);
              foreach (
              $vars as $var) {
                
              $pos strpos($var'-');
                
              $_GET[substr($var0$pos)] = substr($var$pos+1);
              }
              unset(
              $vars$var$pos); 
              wohl das gewünschte bringen

              Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

              bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
              Wie man Fragen richtig stellt

              Kommentar


              • #8
                http://googlewebmastercentral.blogsp...uidelines.html

                ein genereller einwand meinerseits: wenn du mehr als 3-5 parameter in der url brauchst, hast du irgendwas schlecht konzipiert. überdenke den ansatz - was davon kann in eine session ausgelagert werden? was davon deutet auf schlechten inhaltlichen aufbau der seite hin?

                Kommentar


                • #9
                  Besten Dank ghostgambler, das könnte wohl meine Lösung sein.

                  @penizillin: Ich benutze im Moment so gut wie nirgendwo mehr als 1-2 Parameter. Allerdings hatte ich nicht vor, mich da in irgendeiner Form selbst einzuschränken. Da es außerdem um ein CMS geht, welches durch Module anderer Autoren erweitert werden kann, ist nicht sichergestellt, das nie mehr als 3-5 Parameter auftreten.
                  Meine eigene Lösung mit 4 Parametern ist also nicht ausreichend. Doch die Lösung über Pathinfo ist super, da im Grunde unendlich viele Parameter möglich sind.
                  Vielleicht kann ich sogar beides anbieten, je nachdem was die User auf ihrem Webspace konfigurieren dürfen!

                  Werde die Pathinfo-Lösung nachher mal zu Hause ausprobieren!

                  Kommentar


                  • #10
                    Die Länge einer URL ist begrenzt.

                    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                    Wie man Fragen richtig stellt

                    Kommentar


                    • #11
                      Original geschrieben von ghostgambler
                      Die Länge einer URL ist begrenzt.
                      Ist sie nur theoretisch beschränkt oder technisch vom Server her? Ich hab auch vor einiger Zeit gelesen, dass die URL-Länge auf 255 Zeichen begrenzt ist, allerdings auch, das die heutigen Browser und Server keine Überprüfung der Länge vornehmen und auch mit längeren URLs arbeiten.

                      Kommentar


                      • #12
                        Ich habe es jetzt zu Hause so gelöst, wie ghostgambler vorgeschlagen hat und funktioniert bestens! Wer auch Interesse an der Lösung hat:

                        Folgenden Codeschnipsel in die .htaccess im gewünschten Verzeichnis einfügen:
                        Code:
                        <Files *.php>
                        	Options +Includes
                        	SetOutputFilter INCLUDES
                        	AcceptPathInfo On
                        </Files>
                        Und in den PHP-Dateien (config-Datei oder was auch immer) fügt ihr folgenden Schnipsel ein (Danke ghostgambler )
                        PHP-Code:
                        $vars explode('/'$_SERVER['PATH_INFO']);
                        foreach ( 
                        $vars as $var ) {
                            if( 
                        is_string$var ) and trim$var )!='' ) {
                                
                        $pos strpos$var'-' );
                                if( 
                        $pos===false or $pos<=) {
                                    
                        $_GET[] = str_replace'+'' '$var );
                                }
                                else {
                                    
                        $key str_replace'+'' 'substr$var0$pos ) );
                                    
                        $value str_replace'+'' 'substr$var$pos+) );
                                    
                        $_GET[$key] = $value;
                                }
                            }
                        }
                        unset( 
                        $vars$var$pos$key$value ); 
                        Jetzt können die GET-Parameter in einer verzeichnisähnlichen URL übergeben werden:
                        Code:
                        http://localhost/script.php/eins-1/zwei-2/drei-3/vier-4/fuenf-5/
                        Zusätzlich zu dieser Schreibweise können noch normale Parameter hinten angehängt werden!



                        --> Problem gelöst

                        Kommentar


                        • #13
                          Original geschrieben von PHP-Desaster
                          Ist sie nur theoretisch beschränkt oder technisch vom Server her? Ich hab auch vor einiger Zeit gelesen, dass die URL-Länge auf 255 Zeichen begrenzt ist, allerdings auch, das die heutigen Browser und Server keine Überprüfung der Länge vornehmen und auch mit längeren URLs arbeiten.
                          Also ich weiß was von 2000 Zeichen, aber was genau von dieser Grenze betroffen ist weiß ich nicht.

                          PHP-Code:
                          if( is_string$var 
                          Was sollte $var sonst sein?

                          PHP-Code:
                          $key str_replace'+'' 'substr$var0$pos ) ); 
                          Es gibt auch urldecode, was dann auch alle Zeichen richtig wandelt~

                          Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                          bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                          Wie man Fragen richtig stellt

                          Kommentar


                          • #14
                            Also ich weiß was von 2000 Zeichen, aber was genau von dieser Grenze betroffen ist weiß ich nicht.
                            Werde ich wohl nicht überschreiten, denke ich ^^


                            Was sollte $var sonst sein?
                            Ja, hast recht!

                            Es gibt auch urldecode, was dann auch alle Zeichen richtig wandelt~ [/B]
                            Jep, wusste ich ^^ Aber danke, werde ich austauschen (Es ist echt die falsche Zeit, nach einem 12-Stunden-Tag...)

                            Edit: Jetzt weiß ich, warum ich nur das + ersetzt habe! Die URL wird ja von PHP vorher ersetzt. Und doppelt escapen ist kaputt escapen
                            Zuletzt geändert von PHP-Desaster; 16.08.2007, 20:53.

                            Kommentar


                            • #15
                              hm... jop hast recht

                              Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                              bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                              Wie man Fragen richtig stellt

                              Kommentar

                              Lädt...
                              X