Usando mod_rewrite y mod_alias (redirigir 301) juntos en .htaccess?
-
27-10-2019 - |
Pregunta
Tengo un sitio con un conjunto de páginas antiguas .html y .php que se han puesto en un CMS.
Actualmente en el archivo .htaccess hay alrededor de 30 redireccionamientos mod_alias en la siguiente forma:
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
Pero queremos usar mod_rewrite para tener URL bonitas en nuestro CMS, lo que tomará el formulario http://www.example.com/pagename.php
, así también tengo lo siguiente:
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?page=$1
Por el momento, ambos se aplican juntos, lo que resulta en:
http://www.example.com/newpage1.php?page=oldpage1.html
¿Cómo puedo aplicar la regla de reescritura solo cuando no se ha hecho ninguna coincidencia por las declaraciones Mod_alias Redirect 301, de modo que ocurra lo siguiente:
http://www.example.com/oldpage1.html
-> redirige a ->http://www.example.com/newpage1.php
-> que se trata como ->http://www.example.com/index.php?page=/newpage1.php
¿Alguna pista sería muy apreciada? Gracias.
Solución
Encontré la respuesta en un Gran explicación de mod_rewrite y mod_alias
El problema es que mod_rewrite siempre ocurre antes de mod_alias, independientemente del orden en que se coloquen .htaccess. Este es el reverso del orden requerido para esta situación.
El truco es usar RewriteRule [R=301]
en vez de redirect 301
, y, por lo tanto, use mod_rewrite para todo en lugar de mezclarlo con mod_alias.
La solución completa es la siguiente:
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