htaccess Rewrite dynamisch mehrere Ordner
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
aufruf
aussehen
code
dank
ebenen funktioniert beispiel
ersetzen
flag
index
mache
ordern
ordner
page
parameter
regel
reihenfolge
richtig funktionieren
string
struktur
url
zeile
-
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
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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]
-
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 ? -
sparsuche schrieb:
Das funktioniert deshalb, weil jeweils
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 ?
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:
Was meinst du damit? Warum soll das hinfällig sein?
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 .... ?
sparsuche schrieb:
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.
also doch je Ebene eine eigene RewriteRule ... -
chatstory schrieb:
Das ist einfacher, ich hab hier nur vergessen, dass es so auch möglich ist...
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?
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]
-
hackyourlife schrieb:
sparsuche schrieb:
Was meinst du damit? Warum soll das hinfällig sein?
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 .... ?
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 ?!
-
sparsuche schrieb:
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.
hackyourlife schrieb:
sparsuche schrieb:
Was meinst du damit? Warum soll das hinfällig sein?
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 .... ?
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 ?
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]
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage