Anatol: mod-rewrite: Fake-Ordner in URL-query verwandeln

Hallo Forum!

Ich habe schon einiges zu diesem Thema gelesen und auch selbst eine Lösung gefunden, bin aber noch nicht 100%ig glücklich damit.

Ich möchte eine vom User aufgerufene URL wie z.B.

www.domainname.com/bettyboo/guestbook/20060217/

auf eine Seite mit URL query weiterleiten, die die Namen der Ordner als Argumente übergibt. z.B:

www.domainname.com/index.php?argument1=bettyboo&argument2=guestbook&argument3=20060217

Ich habe eine Lösung gefunden die gut funktioniert (sowohl mit als auch ohne abschließendem '/'). Meine .htaccess-Datei sieht folgendermaßen aus:


RewriteEngine on
Options +FollowSymlinks
RewriteBase /

ueberprueft, ob das File/der Ordner tatsaechlich existiert, wenn ja, diesen Ordner/dieses File anzeigen

RewriteCond %{REQUEST_FILENAME}  -d [OR]
RewriteCond %{REQUEST_FILENAME}  -f
RewriteRule  ^.*$  -  [L]

RewriteRules um Namen der Fake-Ordner an Datei mit Argumenten zu uebergeben

RewriteRule ^(.*[^/])/(.*[^/])/(.*[^/])/(.*[^/]) errors/404.html [QSA,L]
RewriteRule ^(.*[^/])/(.*[^/])/(.*[^/])/*$       index.php?argument1=$1&argument2=$2&argument3=$3 [QSA,L]
RewriteRule ^(.*[^/])/(.*[^/])/*$                index.php?argument1=$1&argument2=$2 [QSA,L]
RewriteRule ^(.*[^/])/*$                         index.php?argument1=$1 [QSA,L]


Ich habe noch nicht viel getestet, aber es scheint zu funktionieren.

Nun hätte ich zwei Fragen:

1. Versucht der User in diesem Fall tiefer als 3 Unterordner zu gehen, so wird auf die Datei 404.html weitergeleitet. Gibt es eine Möglichkeit, das so hinzubekommen, dass auch ein logscript den 404 Error mitbekommt (also für eine Statistik?) Ist nicht so wichtig, aber es wäre ganz nett.

2. Eigentlich wollte ich eine "unlimitierte" Anzahl von Argumenten ermöglichen. D.h. wenn ein User die Seite www.domainname.com/1/2/3/...etc.../999 aufruft, dann werden alle Unterordnernamen als Argumente übergeben
(index.php?argument1=1&argument2=2&...etc...&argument999=999).
Kann ich das nicht irgendwie erreichen (ohne "unendlich" viele Zeilen wie in obigem .htaccess-File zu schreiben)? Per mod-rewrite könnte ich dann zwar auf keinen 404 Error mehr weiterleiten, das wäre mir aber auch egal. Das könnte ich ja auch von PHP aus steuern.

Ich bin für alle Anregungen dankbar.

Schöne Grüße
Anatol

  1. Hallo Anatol,

    1. Eigentlich wollte ich eine "unlimitierte" Anzahl von Argumenten ermöglichen. D.h. wenn ein User die Seite www.domainname.com/1/2/3/...etc.../999 aufruft, dann werden alle Unterordnernamen als Argumente übergeben
      (index.php?argument1=1&argument2=2&...etc...&argument999=999).
      Kann ich das nicht irgendwie erreichen (ohne "unendlich" viele Zeilen wie in obigem .htaccess-File zu schreiben)? Per mod-rewrite könnte ich dann zwar auf keinen 404 Error mehr weiterleiten, das wäre mir aber auch egal. Das könnte ich ja auch von PHP aus steuern.

    Nur eine kleine Idee... www.domainname.com/argument1/1/argument2/2.../argument999/999 wird zu www.domainname.com?argument1=1&argument2=2&...argument999=999...

    Viel Spaß,
    small-step

  2. Hallo,

    was Du mit Deiner jetzigen Konfiguration betreibst, ist relativ aufwändig und unnötig.

      
      
    RewriteEngine On  
    RewriteBase /  
      
    RewriteCond %{REQUEST_URI} ^/was_weiss_ich/(.*)$  
    RewriteRule ^(.*)          test.php?$1  
    
    
      
    <?php  
    /* test.php */  
    $argumente=explode('/',$_SERVER['QUERY_STRING']);  
    // usw...  
    ?>  
    
    

    Gruß aus Berlin!
    eddi

    --
    Wer Rechtschreibfehler findet, darf sie behalten.
    1. Hallo eddi,

      [...]

      RewriteRule ^(.*)          test.php?$1
      [...]

        
      Ich würde eher sowas machen:  
        
      ~~~apache
      RewriteCond %{REQUEST_FILENAME} !-f  
      RewriteCond %{REQUEST_FILENAME} !-d  
      RewriteRule ^(.*)          test.php?__url=$1    [QSA]
      

      Dann kann nämlich auch eine (zusätzliche) Query-String übergeben werden. (Dank QSA) Im Script muss natürlich $_GET['__url'] und nicht $_SERVER['QUERY_STRING'] ausgewertet werden. Alle Dateien, die existieren, werden angezeigt, alle anderen werden an test.php übergeben.

      Viele Grüße,
      Christian

      1. Heißa, Christian,

        Ich würde eher sowas machen:

        RewriteCond %{REQUEST_FILENAME} !-f

        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*)          test.php?__url=$1    [QSA]

        
        > Dann kann nämlich auch eine (zusätzliche) Query-String übergeben werden. (Dank QSA)  
          
        Ich bevorzuge in solchen Fällen, den aufgerufenen Pfad in eine Umgebungsvariable zu laden:  
        `RewriteRule ^(.*) /test.php [QSA][E=REQUESTED_PAGE:$1]`{:.language-apache}  
          
        Dann weiß ich sicher, dass nichts Unerwüschtes herauskommt, wenn Zeichen wie & in der URL vorkommen. Vom PHP-Script aus kann ich dann per $\_SERVER['REQUESTED\_PAGE'] auf die URL zugreifen.  
          
          
        
        > Alle Dateien, die existieren, werden angezeigt, alle anderen werden an test.php übergeben.  
          
        Interessante Idee, wusste noch nicht, dass sowas möglich ist.  
          
          
        Gautera!  
        Grüße aus [Biberach Riss](http://www.stadt-biberach.de/),  
        Candid Dauth  
        
        -- 
        Ein Fußball-Fan? Noch auf der Suche eine Schlafmöglichkeit im Großraum Stuttgart für die WM 2006? Wie wäre es mit Herrenberg, einer gemütlichen Kleinstadt am Rande des Schönbuchs – von der Lage her ideal, auch für andere Vorhaben im Urlaub. [Ferienwohnungen-Herrenberg.com](http://www.ferienwohnungen-herrenberg.com/).  
          
        <http://cdauth.de/>
        
        1. Hello,

          RewriteCond %{REQUEST_FILENAME} !-f
          RewriteCond %{REQUEST_FILENAME} !-d
          RewriteRule ^(.*)          test.php?__url=$1    [QSA][/code]
          Dann kann nämlich auch eine (zusätzliche) Query-String übergeben werden. (Dank QSA)

          Ich bevorzuge in solchen Fällen, den aufgerufenen Pfad in eine Umgebungsvariable zu laden:
          RewriteRule ^(.*) /test.php [QSA][E=REQUESTED_PAGE:$1]

          Dann weiß ich sicher, dass nichts Unerwüschtes herauskommt, wenn Zeichen wie & in der URL vorkommen. Vom PHP-Script aus kann ich dann per $_SERVER['REQUESTED_PAGE'] auf die URL zugreifen.

          Könntet Ihr bitte so nett sein und nochmal dazuschreiben, welches Statement was bewirkt?
          Dann kann ich das gleich in meine Sammlung legen in dem Bewusstsein, keine eigenen Interpretationsfehler eingebaut zu haben :-)

          Harzliche Grüße vom Berg
          http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau

          1. Heißa, Tom,

            RewriteRule ^(.*) /test.php [QSA][E=REQUESTED_PAGE:$1]
            Könntet Ihr bitte so nett sein und nochmal dazuschreiben, welches Statement was bewirkt?

            [QSA] steht für QueryStringAppend und bewirkt, dass der QueryString (für alle Nicht-Toms: das nach dem Fragezeichen in der URL) nach der „Umleitung“ automatisch an die neue URL gehängt wird.

            Und das [E=REQUESTED_PAGE:$1] ist so aufgebaut:
            „E=“: Das Flag, dass dafür sorgt, dass eine Environment-Variable angelegt wird. (Auf die man aus PHP über $_SERVER zugreifen kann.)
            „REQUESTED_PAGE“: Der Name der Umgebungsvariable, hier kann man etwas Beliebiges definieren, dass dann als Index in $_SERVER benutzt wird.
            „$1“: Der Teil des regulierenden Ausdrucks, der in die Umgebungsvariable gespeichert wird.

            Gautera!
            Grüße aus Biberach Riss,
            Candid Dauth

            --
            Ein Fußball-Fan? Noch auf der Suche eine Schlafmöglichkeit im Großraum Stuttgart für die WM 2006? Wie wäre es mit Herrenberg, einer gemütlichen Kleinstadt am Rande des Schönbuchs – von der Lage her ideal, auch für andere Vorhaben im Urlaub. Ferienwohnungen-Herrenberg.com.
            http://cdauth.de/