kostenloser Webspace werbefrei: lima-city


htaccess Rewrite dynamisch mehrere Ordner

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    sparsuche

    sparsuche hat kostenlosen Webspace.

    Hallo

    ich möchte Seiten-Links als Ordner-Struktur anzeigen
    auf jeden Aufruf können noch weitere Parameter (?page=) vorkommen

    dazu brauche ich eine Rewrite-Regel, die über mehrere Ordner-Ebenen funktioniert

    Beispiel:

    meinedomain.de/auswahl1/
    meinedomain.de/auswahl1/auswahl2/?page=2
    meinedomain.de/auswahl1/auswahl2/auswahl3/
    meinedomain.de/auswahl1/auswahl2/auswahl3/auswahl4/

    Die Rewrite-Regel soll dann aus der Anfrage die index.php mit Parameter aufrufen:
    (wenn "Ebene" nicht existiert, kann der Parameter auch "leer" übergeben werden, muss aber nicht)

    index.php?a=auswahl1&b=&c=&d=
    index.php?a=auswahl1&b=auswahl2&c=&d=&page=2
    index.php?a=auswahl1&b=auswahl2&c=auswahl3&d=
    index.php?a=auswahl1&b=auswahl2&c=auswahl3&d=auswahl4

    könnte dann eine RewriteRule dafür so aussehen ?

    RewriteEngine on
    RewriteBase /
    
    RewriteCond %{REQUEST_URI} (.*)$
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    
    RewriteRule ^([\w]+)/?([\w]+)?/?([\w]+)?/?([\w]+)? /index.php?a=$1&b=$2&c=$3&d=$4 [L,QSA]


    oder muss ich dafür dann für jede "Ebene" eine eigene Regel erstellen?

    PS:
    und das ([\w]+) ... was wenn in den Parametern Unterstrich _ oder Minus - vorkommt ?!
    alternative für "alles" (.*) erfassen oder Sonderzeichen da irgendwie einfügen ?
    einfach (.*) oder (.*+) ?

    Danke



  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Versuch es so:
    RewriteEngine on
    RewriteBase /
    
    RewriteCond %{REQUEST_URI} (.*)$
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    
    RewriteRule ^([^\/]+?)$ index.php?a=$1&b=$2&c=$3&d=$4&%{QUERY_STRING} [L]
    RewriteRule ^([^\/]+?)\/([^\/]+?)$ index.php?a=$1&b=$2&c=$3&d=$4&%{QUERY_STRING} [L]
    RewriteRule ^([^\/]+?)\/([^\/]+?)\/([^\/]+?)$ index.php?a=$1&b=$2&c=$3&d=$4&%{QUERY_STRING} [L]
    RewriteRule ^([^\/]+?)\/([^\/]+?)\/([^\/]+?)\/([^\/]+?)$ index.php?a=$1&b=$2&c=$3&d=$4&%{QUERY_STRING} [L]
  4. Autor dieses Themas

    sparsuche

    sparsuche hat kostenlosen Webspace.

    Danke,
    also doch je Ebene eine eigene RewriteRule ...


    aber wenn ich je Ebene eine eigene RewriteRule mache,
    braucht man dann das [^\/]+? überhaupt
    das ist doch dann hinfällig. weil ehh alle Ebenen als Regel da sind .... ?

    und muss die Reihenfolge nicht andersrum, also zuerst die 4, dann 3 , dann 2 dann 1 Ebene(n)
    weil ein Aufruf mit 2 Order würde so ja schon mit der Regel für einen Ordner umgeschrieben,
    denn der erste Ordner ist ja dann "auch schon da"
    und durch das [L] wird ja dann nicht weiter "gesucht"

    oder ?
  5. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    sparsuche schrieb:
    und muss die Reihenfolge nicht andersrum, also zuerst die 4, dann 3 , dann 2 dann 1 Ebene(n)
    weil ein Aufruf mit 2 Order würde so ja schon mit der Regel für einen Ordner umgeschrieben,
    denn der erste Ordner ist ja dann "auch schon da"
    und durch das [L] wird ja dann nicht weiter "gesucht"

    oder ?
    Das funktioniert deshalb, weil jeweils
    [^\/]+?
    verwendet wird. das
    +?
    macht verändert das Verhalten soweit, dass nur die kürzest mögliche Zeichenfolge getroffen wird (Default: die längste Zeichenfolge wird getroffen). Deshalb ist hier die Reihenfolge egal.

    sparsuche schrieb:
    aber wenn ich je Ebene eine eigene RewriteRule mache,
    braucht man dann das [^\/]+? überhaupt
    das ist doch dann hinfällig. weil ehh alle Ebenen als Regel da sind .... ?
    Was meinst du damit? Warum soll das hinfällig sein?

    sparsuche schrieb:
    also doch je Ebene eine eigene RewriteRule ...
    Ist der einfachste Weg, der mir eingefallen ist. Ein paar Regex-Experten könnten dir möglicherweise noch einen umständlicheren Weg beschreiben, aber das sollte der einfachste sein.
  6. Also um den Query-String mit anzuhängen, sollte doch auch die QSA-Flag geeignet sein, also sowas wie [QSA] hinten an jede Zeile dran?

    Ist das nicht einfacher?
  7. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    chatstory schrieb:
    Also um den Query-String mit anzuhängen, sollte doch auch die QSA-Flag geeignet sein, also sowas wie [QSA] hinten an jede Zeile dran?

    Ist das nicht einfacher?
    Das ist einfacher, ich hab hier nur vergessen, dass es so auch möglich ist...

    Es sollte also so aussehen:
    RewriteEngine on
    RewriteBase /
    
    RewriteCond %{REQUEST_URI} (.*)$
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    
    RewriteRule ^([^\/]+?)$ index.php?a=$1&b=$2&c=$3&d=$4 [L,QSA]
    RewriteRule ^([^\/]+?)\/([^\/]+?)$ index.php?a=$1&b=$2&c=$3&d=$4 [L,QSA]
    RewriteRule ^([^\/]+?)\/([^\/]+?)\/([^\/]+?)$ index.php?a=$1&b=$2&c=$3&d=$4 [L,QSA]
    RewriteRule ^([^\/]+?)\/([^\/]+?)\/([^\/]+?)\/([^\/]+?)$ index.php?a=$1&b=$2&c=$3&d=$4 [L,QSA]
  8. Autor dieses Themas

    sparsuche

    sparsuche hat kostenlosen Webspace.

    hackyourlife schrieb:
    sparsuche schrieb:
    aber wenn ich je Ebene eine eigene RewriteRule mache,
    braucht man dann das [^\/]+? überhaupt
    das ist doch dann hinfällig. weil ehh alle Ebenen als Regel da sind .... ?
    Was meinst du damit? Warum soll das hinfällig sein?


    ich meine damit, wenn man die Reihenfolge umkehrt
    also zuerst die tiefst-mögliche Struktur prüft
    dann könnte man das
    ([^\/]+?)
    doch ersetzen durch
    (.*)


    RewriteRule ^(.*)\/(.*)\/(.*)\/(.*)$ index.php?a=$1&b=$2&c=$3&d=$4 [L,QSA]
    RewriteRule ^(.*)\/(.*)\/(.*)$ index.php?a=$1&b=$2&c=$3&d=$4 [L,QSA]
    RewriteRule ^(.*)\/(.*)$ index.php?a=$1&b=$2&c=$3&d=$4 [L,QSA]
    RewriteRule ^(.*)$ index.php?a=$1&b=$2&c=$3&d=$4 [L,QSA]


    oder ist das so rum nicht so geschickt ?

    und muss man die Slash-Zeichen unbedingt escapen?
    habe es auch ohne ausprobiert, und es hat auch ohne funktioniert ?!




  9. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    sparsuche schrieb:
    hackyourlife schrieb:
    sparsuche schrieb:
    aber wenn ich je Ebene eine eigene RewriteRule mache,
    braucht man dann das [^\/]+? überhaupt
    das ist doch dann hinfällig. weil ehh alle Ebenen als Regel da sind .... ?
    Was meinst du damit? Warum soll das hinfällig sein?


    ich meine damit, wenn man die Reihenfolge umkehrt
    also zuerst die tiefst-mögliche Struktur prüft
    dann könnte man das
    ([^\/]+?)
    doch ersetzen durch
    (.*)


    RewriteRule ^(.*)\/(.*)\/(.*)\/(.*)$ index.php?a=$1&b=$2&c=$3&d=$4 [L,QSA]
    RewriteRule ^(.*)\/(.*)\/(.*)$ index.php?a=$1&b=$2&c=$3&d=$4 [L,QSA]
    RewriteRule ^(.*)\/(.*)$ index.php?a=$1&b=$2&c=$3&d=$4 [L,QSA]
    RewriteRule ^(.*)$ index.php?a=$1&b=$2&c=$3&d=$4 [L,QSA]


    oder ist das so rum nicht so geschickt ?
    Wenn du das ausprobierst und einen Ordner in der 5. Ebene ansprichst (a/b/c/d/e) wird ?a=a/b gesetzt, was vermutlich nicht gewünscht ist. Das geschieht deshalb, weil (.*) den längstmöglichen String sucht, auf den das Muster zutrifft.
    So würde es hingegen richtig funktionieren:
    RewriteRule ^([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)$ index.php?a=$1&b=$2&c=$3&d=$4 [L,QSA]
    RewriteRule ^([^\/]*)\/([^\/]*)\/([^\/]*)$ index.php?a=$1&b=$2&c=$3&d=$4 [L,QSA]
    RewriteRule ^([^\/]*)\/([^\/]*)$ index.php?a=$1&b=$2&c=$3&d=$4 [L,QSA]
    RewriteRule ^([^\/]*)$ index.php?a=$1&b=$2&c=$3&d=$4 [L,QSA]
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!