mod_rewrite: Dynamisch Pfade umwandeln
Sebastian Salzgeber
- webserver
Hallo zusammen
MEine Frage geht dahin, dass ich gerne wissen würde, wie ich die htaccess schreiben muss, damit ich eine dynamische umwandlung von Pfadangaben zu parametern bekomme.
Bisher benutze ich dies hier:
RewriteRule ^/?$ index.php?pMain=index [L]
RewriteRule ^([^/\.]+)/?$ index.php?pEnd=$1 [L]
RewriteRule ^([^/\.]+)/([^/\.]+)/?$ index.php?p1=$1&pEnd=$2 [L]
RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ index.php?p1=$1&p2=$2&pEnd=$3 [L]
RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ index.php?p1=$1&p2=$2&p3=$3&pEnd=$4 [L]
RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ index.php?p1=$1&p2=$2&p3=$3&p4=$4&pEnd=$5 [L]
Damit bekomme ich folgende übersetzung hin:
example.com/eins/zwei/ => /index.php?p1=eins&pEnd=zwei
example.com/eins/zwei/drei/ => /index.php?p1=eins&p2=zwei&pEnd=drei
...
Wie ihr seht, habe ich dies für 4 unterebenen angelegt, weswgeen sich die regexp auch so oft wiederholt und es mir möglich war, den letzetn parameter immer pEnd zu nennen.
Ich würde aber gerne wissen, ob ich den Pfad nicht auch mit einer einzigen RewriteRule umschreiben könnte; Ich also jetzt nicht diese Zeile quasi 20x widerholen muss, nur um auch in der 20. Ebene noch eine umleitung zu bekommen. Das ist ja doch sehr manuell was ich da gemacht habe.
Ich weiss dass einige Model View Controller, auf diese Weise, die Pfade zum laden der Module in PHP extrahieren. Aber geht da snicht auch in der .htaccess-Datei?
Was ich letzlich haben möchte ist:
example.com/eins/zwei/ => /index.php?p1=eins&p2=zwei //Was aktuell ja quasi schon manuell geht
example.com/eins/zwei/drei/hund/katze/maus/ => /index.php?p1=eins&p1=zwei&p3=drei&p4=hund&p5=katze&p6=maus
...
Schönen Sonntag
Sebastian S.
hi,
MEine Frage geht dahin, dass ich gerne wissen würde, wie ich die htaccess schreiben muss, damit ich eine dynamische umwandlung von Pfadangaben zu parametern bekomme.
Meine Gegenfrage geht dahin, zu wissen, ob für Dich auch _eine_ Regel für _alle_ Dateien mit _einer_ einheitlichen Dateierweiterung (z.B. .html) reichen würde?
Sag ja und ich schreib Dir die Regel auf ;-)
Hotti
Sag ja und ich schreib Dir die Regel auf ;-)
Ich sage ja
(vielleicht kann ich sie ja selber noch tweaken mehrere Dateiendungen zu behandeln :)
Grüße
Sebastian S.
hi,
Sag ja und ich schreib Dir die Regel auf ;-)
Ich sage ja
RewriteEngine on
RewriteRule ^(.*).html$ /script.php?path=$1
oder ohne Klammer
RewriteRule ^.*.html$ /script.php
V1 hat den Vorteil, Du hast den path gleich als Parameter. In v2 musst Du den kompletten REQUEST_URI auseinandernehmen (in script.php). In beiden Varianten gehen _alle_ Requests like
http://example.com/index.html
http://example.com/dir/index.html
http://example.com/dir/subdir/index.html
^REQUEST_URI ab hier
auf das Script script.php, was die Pfade ermittelt und die Inhalte ausliefert.
(vielleicht kann ich sie ja selber noch tweaken mehrere Dateiendungen zu behandeln :)
Entweder globben (.htm*) oder je .ext eine eigene Regel.
Hotti
Hotti
Dank dir. Ich habe es jetzt genauso gemacht und werde in PHP REQUEST_URI nach meinen Bedürfnissen zershcneiden. Scheint auch nicht so fehleranfällig zu sein, da man diverse exceptions direkt abfangen kann.
Grüße
Sebastian S.