Hallo Alfie,
wo genau steht die .htaccess-Datei, in der Du diese RewriteRule definiert hast? Nur im Root deines Webs? Oder auch im /foo Ordner?
Wenn Du die URL /foo/bar/dings.htm abrufst, dann sieht eine RewriteRule in /.htaccess sie als "foo/bar/dings.htm". Eine RewriteRule in /foo/.htaccess sieht das Gleiche als "bar/dings.htm" und die RewriteRule in /foo/bar/.htaccess sieht nur "dings.html". Das muss man beim Formulieren der Rules beachten.
Gültig sind zuerst die RewriteRules in dem Ordner, der der Ziel-Ressource am nächsten ist. Aber die in den Elternverzeichnissen werden auch beachtet, sofern die RewriteRules der tieferen Ordner nicht STOP gesagt haben (mit dem L in den eckigen Klammern).
Deshalb MÜSSTE es eigentlich reichen, wenn Du nur in /.htaccess eine RewriteRule hast.
Zum Unterschied zwischen rewrite und redirect:
- rewrite
- Browser schickt Request /foo/bar.htm
- Server tut intern so, als hättest Du /foo/bar.phtml abgerufen und antwortet mit dem Inhalt dieser Seite (bzw. dem PHP Output)
- redirect
- Browser schickt Request /foo/bar.htm
- Server antwortet mit HTTP Status 301: "Ist umgezogen, neue Adresse ist /foo/bar.phtml"
- Browser sagt "ach so" und schickt neuen Request an /foo/bar.phtml
- Server schickt Inhalt dieser Seite (bzw. den PHP Output)
Der Unterschied in der .htaccess Datei ist das [R=301,L]. Das bestellt den Statuscode 301 und schickt ihn zusammen mit dem Ergebnis der RewriteRule zurück (das R). Danach hört der Apache auf, nach RewriteRules zu sorgen (das L).Aber Achtung, die Apache Doku sagt, dass ein R einen Zielpfad mit / vorneweg haben muss. Ein Redirect von ^(.*).htm$ nach $1.phtml ist nicht möglich. Nur nach /$1.phtml.
Das von Robert genannte QSA bedeutet, dass ein Querystring der umgeschriebenen URL übernommen werden soll. Wenn Du also URLs mit Parametern hast, brauchst Du das QSA, sonst gehen die verloren.
Rolf
sumpsi - posui - obstruxi