mod_rewrite - regular expression
Groudon
- webserver
1 ChrisB1 berlinsurfer0 Groudon
Hallo,
ich erstelle momentan ein kleines CMS und möchte mittels des mod_rewrite-Moduls alle Anfragen umleiten. Allerdings bekomme ich den benötigten regulären Ausdruck nicht so richtig hin. Ich habe schon überlegt, ob ich das Muster nicht auf verschiedene Rules verteile.
Das Muster soll nicht enthalten:
- dynamisch.php
- alles mit index im Namen
Das Muster soll enthalten:
- alles was mit .htm, .html, usw. endet
- keine Endung hat.
Die aufgerufene Adresse soll dann an dynamisch.php übergeben werden.
Hier einer meiner Versuche.
RewriteRule ^[^d][^y][^n][^a][^m][^i][^s][^c][^h][^\.][^p][^h][^p](.*)\.html$ /dynamisch.php?b=$1 [QSA]
Aber kann man das auch kürzer formulieren?
Oder um das ganze in Einzelanweisungen zu zerlegen habe ich geprüft ob ein Punkt enthalten ist. (.*\..*)
Mit dieser Anweisung komme ich nicht weit, da es sich um .html, .css, .png, .usw. handeln könnte. Also benötige ich die Negation davon. Bei der habe ich aber dann das Problem, dass ich nicht den ursprünglichen Request bekomme(s.h. unter Hinweis).
Falls mir jemand helfen könnte oder mir Hinweise gibt, wie ich weiter vorankomme, würde ich mich total freuen.
Hi,
Das Muster soll nicht enthalten:
- dynamisch.php
- alles mit index im Namen
Das Muster soll enthalten:
- alles was mit .htm, .html, usw. endet
- keine Endung hat.
Die aufgerufene Adresse soll dann an dynamisch.php übergeben werden.
Hier einer meiner Versuche.
RewriteRule ^[^d][^y][^n][^a][^m][^i][^s][^c][^h][^\.][^p][^h][^p](.*)\.html$ /dynamisch.php?b=$1 [QSA]
Aber kann man das auch kürzer formulieren?
Mit einem vorangestellten ! kannst du ein Pattern komplett negieren.
Allerdings kannst du dabei dann m.W. keine Back References benutzen - weil du ja nur Nicht-Treffer suchst, und keine Treffer.
Das könnte man machen, in dem man eine RewriteCond vor die Regel stellt (oder mehrere) - die kann abprüfen, ob bspw. der REQUEST_FILENAME nicht dynamisch.php lautet und nicht index enthält.
MfG ChrisB
Guckst du hier:
Das Muster soll nicht enthalten:
- dynamisch.php
- alles mit index im Namen
Zum ersten: warum ?
Zum zweiten: RewriteCond %{REQUEST_URI} !index
Das Muster soll enthalten:
- alles was mit .htm, .html, usw. endet
- keine Endung hat.
RewriteCond %[REQUEST_URI} (.html|.htm.|.php|.css)$ [OR]
RewriteCond %{REQUEST_URI} [^.]$
Zusammengesetzt sieht das dann so aus:
RewriteEngine On
RewriteCond %{REQUEST_URI} !index
RewriteCond %[REQUEST_URI} (\.html|\.htm\.|\.php|\.css)$ [OR]
RewriteCond %{REQUEST_URI} [^.]$
RewriteRule (.*) dynamisch.php [L]
Hier einer meiner Versuche.
RewriteRule ^[^d][^y][^n][^a][^m][^i][^s][^c][^h][^\.][^p][^h][^p](.*)\.html$ /dynamisch.php?b=$1 [QSA]
Alles, was in eckigen Klammern steht, bezeichnet Zeichenklassen. Alles mit einem ^ davor, negiert diese. Das brauchst du in diesem Fall sicher nicht.
QSA bezeichnet den originalen Querystring, wenn du ihn veränderst, wird er auch so an dynamisch.php weiter gegeben.
Anmerkung noch: du musst Dir dann natürlich noch überlegen, was du mit Urls mit index machst.
Vielen Dank!
ich hatte mich zu sehr auf einen großen allesumfassenden regulären Ausdruck versteift und RewriteCond total ignoriert.
Ich hab noch ein bissel rumgebastelt und hab jetzt folgende Anweisungen:
RewriteEngine On
RewriteCond %{REQUEST_URI} !index
RewriteCond %{REQUEST_URI} !dynamisch\.php$
RewriteCond %{REQUEST_URI} !(\.php|\.css|\.png|\.jpe?g|\.gif)$
RewriteCond %{REQUEST_URI} (\.html|\.htm|[^.])$
RewriteRule (.*) dynamisch.php?uri=$1 [QSA,L]
Jetzt bekomme ich die ursprüngliche URI und etwaigige Variablen mitgeliefert, sodass ich diese interpretieren kann. Die dynamisch.php soll deswegen nicht, weil das meine Entwicklungsdatei ist. Das ganze ist erst mal vorläufig so, später wird das ganze dann noch ein wenig umgebaut. Da ich ab und zu an verschiedenen Orten arbeite und die daten online sind, kann ich nicht in der Index arbeiten.
Also nochmal vielen Dank!