- Detalles
- Por Juan Padial
- En Web y Servidores
- Visto: 1751
Hoy me han hecho una pregunta sobre las redirecciones 301 con .htaccess. Delhorno se ha encontrado con un antiguo problema cuándo ha intentado hacer una redirección 301. Por lo que se ve, Delhorno utiliza un sistema bastante común de reglas de reescritura que reescriben todas las porciones de la URL a una cadena de consulta (query string) que es interpretada luego por el software de la web para generar el html y mostrar el contenido. Esto es habitual en cualquier plataforma de gestión de contenido web (CMS) como joomla o wordpress. Sin embargo, si en este entorno se intenta hacer una redirección 301 estándar en .htaccess, esto es, utilizando Redirect 301, dará como resultado un query string inesperado que se añade a la URL y que contiene la URL anterior.
Para ilustrar el problema pongamos el caso de Delhorno. Ha intentado hacer la siguiente redirección: dominio.com/videos/video.html => dominio.com/videotutoriales/video.html, y para ello ha utilizado el siguiente código en su .htaccess:
Redirect 301 /videos http://www.dominio.com/videotutoriales
Al hacer esto, Delhorno era efectivamente redireccionado pero si escribía dominio.com/videos/video.html, era redireccionado a dominio.com/videotutoriales/video.html?vid=video
Para eliminar el query string al hacer una redirección 301 en .htaccess se puede recurrir a varios métodos. El que más puede adaptarse a las necesidades más comunes es crear un RewriteRule para hacer una reescritura de la URL vieja por la nueva y poner en esta regla dos flags:
- [L]: indica que es la última regla. El servidor Apache parará aquí y no seguirá mirando por reglas de reescritura adicionales que pudiera haber en el .htaccess.
- [R=301]: indica que es una redirección 301.
Así que la solución puede ser algo así:
RewriteRule ^videos/(.*)$ http://www.dominio.com/videostutoriales/$1 [L,R=301]
Otra opción para hacer esta redirección eliminando el query string es comprobar antes la existencia de una cadena de consulta. Con el siguiente código se hará una redirección 301 de cualquier URL tipo www.dominio.com/archivo.php?loquesa a la URL www.dominio.com/archivo.php.
RewriteCond %{QUERY_STRING} .
RewriteRule ^archivo.php(.*)$ /archivo.php? [L,R=301]
Recuerda poner R=301 y no sólo R pues se hará una redirección de código 302, la cuál no es muy buena si la redirección es por motivos SEO. Habrá otras formas para solucionar el problema del query string añadido a la url al hacer un redirect 301 pero estos ejemplos funcionan genial para mí y creo que pueden ser útiles para la mayoría que se encuentren con este problema.
Existen ocasiones en las que una URL de tu sitio es puesta en algún lugar de la web por un usuario añadiendo algún parámetro a la URL. Tu contenido sigue accesible sin problemas pero puede ser visto como contenido duplicado por Google y otros motores de búsqueda. Hacer la redirección 301 para eliminar estos parámetros sirve para establecer la URL canonical y evitar así este interpretación de contenido duplicado, aunque puede no ser el mejor método en todos los casos (vea URL canonical: qué es y cómo se utilizan).
Creado el 10 03 2012 Actualizado el 03 12 2012
