mod_rewrite www.site.com/dir/ --> www.site.com/dir/2009/

mod_rewrite www.site.com/dir/ --> www.site.com/dir/2009/

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.cssREQUEST_URI wird enthalten /dir/css/theme.cssund $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.cssloswerden , der uns die folgende RewriteRule übrig lässt%{REQUEST_URI}

^(.*)$ 2009/$1 [L,NE]

das wird übersetzt /dir/css/theme.cssin /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.cssauch 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/2009mö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 onsollte es auch ohne Regeln funktionieren.

verwandte Informationen