En utilisant mod_rewrite et mod_alias (rediriger 301) ensemble dans .htaccess?
-
27-10-2019 - |
Question
J'ai un site avec un ensemble de vieilles pages .html et .php qui ont été placées dans un CMS.
Actuellement dans le fichier .htaccess, il y a environ 30 redirections MOD_ALIAS dans la forme suivante:
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
Mais nous voulons utiliser mod_rewrite pour avoir de jolies URL dans notre CMS, qui prendra la forme http://www.example.com/pagename.php
, donc ont également ce qui suit:
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?page=$1
Pour le moment, les deux sont appliqués ensemble, ce qui se traduit:
http://www.example.com/newpage1.php?page=oldpage1.html
Comment puis-je appliquer la règle de réécriture uniquement lorsqu'aucune correspondance n'a été faite par les instructions MOD_ALIAS Redirection 301, de sorte que ce qui suit se produit:
http://www.example.com/oldpage1.html
-> Redirection vers ->http://www.example.com/newpage1.php
-> qui est traité comme ->http://www.example.com/index.php?page=/newpage1.php
Des indices seraient très appréciés? Merci.
La solution
J'ai trouvé la réponse dans un Grande explication de mod_rewrite et mod_alias
Le problème est que mod_rewrite se produit toujours avant mod_alias, quel que soit l'ordre où il est passé dans .htaccess. C'est l'inverse de l'ordre requis pour cette situation.
L'astuce consiste à utiliser RewriteRule [R=301]
à la place de redirect 301
, et donc utiliser mod_rewrite pour tout au lieu de le mélanger avec mod_alias.
La solution complète est la suivante:
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