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.

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top