Verwenden Sie mod_rewrite und mod_alias (umleiten 301) zusammen in .htaccess?
-
27-10-2019 - |
Frage
Ich habe eine Site mit einer Reihe alter .html- und .php -Seiten, die in ein CMS gesteckt wurden.
Derzeit befinden sich in der .htaccess -Datei ungefähr 30 mod_alias -Umleitungen in der folgenden Form:
redirect 301 /oldpage1.html http://www.example.com/newpage1.php
redirect 301 /oldpage2.php http://www.example.com/newpage2.php
redirect 301 /oldpage3.php http://www.example.com/newpage3.php
Aber wir möchten mod_rewrite verwenden, um hübsche URLs in unserem CMS zu haben, was das Formular annimmt http://www.example.com/pagename.php
, Sie haben also auch Folgendes:
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?page=$1
Im Moment werden beide zusammen angewendet, was zu:
http://www.example.com/newpage1.php?page=oldpage1.html
Wie kann ich die Rewrite -Regel nur dann anwenden, wenn die mod_alias -Umleitung 301 Anweisungen vorgenommen wurde, so dass Folgendes auftritt:
http://www.example.com/oldpage1.html
-> Weiterleitet zu ->http://www.example.com/newpage1.php
-> was als -> behandelt wirdhttp://www.example.com/index.php?page=/newpage1.php
Irgendwelche Hinweise würden sehr geschätzt? Vielen Dank.
Lösung
Ich fand die Antwort in a Tolle Erklärung von mod_rewrite und mod_alias
Das Problem ist, dass mod_rewrite immer vor mod_alias vorkommt, unabhängig von der Reihenfolge, die in .htaccess platziert sind. Dies ist die Umkehrung der für diese Situation erforderlichen Reihenfolge.
Der Trick ist zu verwenden RewriteRule [R=301]
Anstatt von redirect 301
, und verwenden Sie daher mod_rewrite für alles, anstatt es mit mod_alias zu mischen.
Die volle Lösung ist wie folgt:
RewriteEngine on
RewriteBase /
RewriteRule ^oldpage1.html /newpage1.php [R=301,L]
RewriteRule ^oldpage2.php /newpage2.php [R=301,L]
RewriteRule ^oldpage3.php /newpage3.php [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?page=$1