Ich habe mir
[src=apache]RewriteRule ^(.*)/(.*)/(.*)$ /seite.php?var1=$1&var2=$2&var3=$3 [L][/src]
mal kurz in eine .htaccess kopiert, eine seite.php geschrieben, die nur var_dump($_GET); macht und "localhost/var1/var2/var3" aufgerufen:
[src=php]array(3) { ["var1"]=> string(4) "var1" ["var2"]=> string(4) "var2" ["var3"]=> string(4) "var3" } [/src]
-> die Regel funktioniert
Gib uns mal mehr Kontext.
Mir fallen allerdings ein paar andere Sachen ein:
Deine Selektoren sind greedy
/var1/var2/var3/ ergibt
[src=php]array(3) { ["var1"]=> string(9) "var1/var2" ["var2"]=> string(4) "var3" ["var3"]=> string(0) "" }[/src]
Das mag kein Problem sein, wenn es nie unerwartetes Zeug am Ende deiner URLs gibt.
Aber so rein aus Prinzip, für mich sieht es so aus als erwartest in var1 alles zu finden, was vor dem ersten Slash steht.
Aber was du schreibst ist:
- Steck alles in var1 !
- du brauchst einen Slash -> nicht erfüllt. Gib solange Zeichen aus var1 ab, bis du einen Slash hast.
- Gefunden! Alles dahinter in var2
- du brauchst einen Slash -> nicht erfüllt. Gib solange Zeichen aus var2 ab, bis du einen Slash hast.
- da ist kein Slash in var2 -> Backtracking! Gib Zeichen aus var1, bis du einen anderen Slash findest.
- Gefunden! Stopf alles dahinter in var2
- du brauchst (immer noch) einen Slash. Gib solange Zeichen aus var2 ab, bis du einen Slash hast.
- Gefunden! Alles dahinter in var3
Die lazy Variante:
[src=apache]RewriteRule ^(.*?)/(.*?)/(.*)$ /seite.php?var1=$1&var2=$2&var3=$3 [L][/src]
Bedeutung:
- Steck erstmal nichts in var1
- du brauchst einen Slash. Steck solange doch Zeichen in var1, bis du einen Slash siehst
- erstmal nichts in var2 stecken
- du brauchst einen Slash. Steck solange doch Zeichen in var2, bis du einen Slash siehst
- Alles weitere in var3
Der letzte darf ruhig greedy sein, in var3 erwartest du ja den ganzen Rest
Ergebnis ist dann:
[src=php]array(3) { ["var1"]=> string(9) "var1" ["var2"]=> string(4) "var2" ["var3"]=> string(5) "var3/" }[/src]
Slashes machen nur Ärger
Slashes sind zwar super beliebt, weil sie so toll aussehen, aber wehe eines deiner Skripte erzeugt eine URL in der var2 leer ist: abc//123
Apache schreibt dir das einfach auf abc/123 um -> Regel feuert nicht. Schlimmer noch, eine ganz andere Regel feuert vielleicht. Sollte das bei dir passieren können, benutz sowas:
[src=apache]RewriteCond %{REQUEST_URI} ^/(.*?)/(.*?)/(.*)$
RewriteRule ^ /seite.php?var1=%1&var2=%2&var3=%3 [L][/src]
Die REQUEST_URI wird nicht geändert (und enthält den Slash am Anfang!), daher ergibt es erwartungsgemäß:
[src=php]array(3) { ["var1"]=> string(3) "abc" ["var2"]=> string(0) "" ["var3"]=> string(3) "123" }[/src]
Wehe aber var1 ist empty: //xyz/123
Doppelte Slashes am Anfang des Pfades gehen gar nicht.
Insbesondere willst du das nicht als relative URL in einem Link haben, denn ein Klick darauf würde zur Domain xyz führen.
Also: Wenn du URLs erzeugst, var1 darf NIEMALS leer sein.
Slashes mappen gerne Dateipfade
Viel Spaß mit der Datei /css/neu/seite.css ;-) Ich vermute du hast diese Zeile, weil sie so offensichtlich ist, einfach nur nicht gepostet:
[src=apache]RewriteCond %{REQUEST_FILENAME} !-f[/src]
Da du, glaube ich, alles in deinen FrontController leitest und daher keine /ajax/api/index.php haben wirst, auf die du dann mit /ajax/api/ zugreifst, wirst du
[src=apache]RewriteCond %{REQUEST_FILENAME} !-d[/src]
vielleicht eher nicht brauchen.
Pfade mögen keine escapten Slashes (%2F)
Sagen wir var1 soll den Referer (http://referer.de) enthalten
?var1=http%3A%2F%2Freferer.de 200
/http%3A%2F%2Freferer.de 404
Siehe
AllowEncodedSlashes-Direktive
Default ist off. Aus Sicherheitsbedenken, für die ich keine Quellen kenne.