2011-01-31 35 views
7

Tengo un sitio con un conjunto de páginas antiguas .html y .php que se han colocado en un CMS.¿Usar mod_rewrite y mod_alias (redireccionar 301) juntos en .htaccess?

Actualmente en el archivo .htaccess hay cerca de 30 mod_alias redireccionamientos de 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 

sino que queremos usar mod_rewrite para tener URLs ricas en nuestro CMS, que adoptará la forma http://www.example.com/pagename.php, por lo también tienen la siguiente:

RewriteEngine on 
RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+)$ index.php?page=$1 

en el momento tanto se están aplicando juntos, lo que se traduce en:

http://www.example.com/newpage1.php?page=oldpage1.html 

¿Cómo puedo aplicar la regla de reescritura sólo cuando hay coincidencia ha sido hecha por los mod_alias redireccionamiento 301 declaraciones, para que ocurra lo siguiente:

http://www.example.com/oldpage1.html -> vuelve a dirigir a -> http://www.example.com/newpage1.php -> que se considere persona - > http://www.example.com/index.php?page=/newpage1.php

Cualquier sugerencia sería muy apreciada? Gracias.

Respuesta

10

he encontrado la respuesta en un great explanation of mod_rewrite and mod_alias

El problema es que siempre se produce antes de mod_rewrite mod_alias, independientemente del orden en el se colocan en .htaccess. Esto es el reverso del orden requerido para esta situación.

El truco es usar RewriteRule [R=301] en lugar de redirect 301, y por lo tanto, usar mod_rewrite para todo en lugar de mezclarlo con mod_alias.

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 
Cuestiones relacionadas