Ich habe Probleme mit dieser Umschreibung. Ich habe mod_rewrite noch nie wirklich verwendet und habe nicht viel Erfahrung mit regulären Ausdrücken. Jede Hilfe ist willkommen!
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine on
#prevent nested looping
RewriteCond %{ENV:REDIRECT_STATUS} ^$
#re-route incoming requests
RewriteRule ^(.*)$ %{REQUEST_URI}2009/$1 [L,NE]
</IfModule>
Das funktioniert teilweise,http://www.site.com/dir/wird weitergeleitet anhttp://www.site.com/dir/2009/aber eine Anfrage wiehttp://www.site.com/dir/css/theme.cssschlägt fehl. Ich hoffe, alle Anfragen an das übergeordnete Verzeichnis in das Unterverzeichnis 2009 umzuschreiben, aber ich stoße immer wieder auf Endlosschleifen und Serverfehlermeldungen. Ich habe keine nützlichen Beispiele gefunden. Ich dachte, dies wäre eine gängige Umschreibung ...
Dank im Voraus!
Antwort1
Es gibt einige Probleme mit der Umschreiberegel in Ihrem Beispiel. Erstens macht sie nicht wirklich das, was Sie wollen – Sie brauchen nichts %{REQUEST_URI}
. Mit dem ursprünglichen Pfad wie /dir/css/theme.css
REQUEST_URI wird enthalten /dir/css/theme.css
und $1 wird enthalten css/theme.css
(übereinstimmend mit (.*)
), was dazu führt, dass die endgültige URL ist . Wir müssen also den Teil /dir/css/theme.css2009/css/theme.css
loswerden , der uns die folgende RewriteRule übrig lässt%{REQUEST_URI}
^(.*)$ 2009/$1 [L,NE]
das wird übersetzt /dir/css/theme.css
in /dir/2009/css/theme.css
.
Allerdings gibt es mit dieser Regel noch ein Problem, da sie eine unendliche Verschachtelung verursacht, da (.*) mit jeder URL übereinstimmt. Was also passiert, ist, dass im ersten Schritt unsere Beispiel-URL in umgeschrieben wird /dir/2009/css/theme.css
. Und da die neue URL /dir/2009/css/theme.css
auch unserer Regel entspricht, wird sie erneut umgeschrieben, und dann noch einmal und noch einmal...
Im Grunde brauchen wir also etwas, das das Umschreiben von URLs verhindert, die bereits umgeschrieben wurden. Wenn die URL also bereits enthält, /dir/2009
möchten wir, dass Apache sie in Ruhe lässt. Eine Möglichkeit, dies zu erreichen, besteht darin, der Umschreibregel die folgende Bedingung hinzuzufügen
RewriteCond %{REQUEST_URI} ^(?!/dir/2009).*$
mit der endgültigen .htaccess-Datei wie dieser
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine on
RewriteBase /dir
RewriteCond %{REQUEST_URI} ^(?!/dir/2009).*$
#re-route incoming requests
RewriteRule ^(.*)$ 2009/$1 [L,NE]
</IfModule>
Eine andere Möglichkeit besteht darin, eine .htacess-Datei im Verzeichnis dir/2009 zu erstellen, die Apache mit etwas wie verhindert, dass es die Datei aus dem übergeordneten Verzeichnis verwendet RewriteEngine off
. Oder vielleicht RewriteEngine on
sollte es auch ohne Regeln funktionieren.