Redirigir URLs a buscadores hacia URLs con paso de parámetros con RewriteRule

  • Por
Continuamos con el manual explicando un primer caso sencillo de redirección de URLs amistosas a buscadores usando RewriteRule.
Ahora vamos a ver cómo realizar con htaccess unas reglas de redirección, de las URLs pensadas para que estén bien promocionadas en buscadores hacia direcciones que nos sean fáciles de procesar y mantener con PHP.

Nota:Hablamos de PHP porque estos trucos con htaccess son para el servidor Apache y el lenguaje de programación típico de este servidor web es PHP.

El archivo htaccess es un fichero de texto que se llama .htaccess, es decir, su nombre comienza con un punto. Se puede crear con cualquier editor de textos y se coloca en el directorio donde deseamos que afecten las configuraciones indicadas dentro del fichero. Si lo colocamos en el directorio de publicación raíz del dominio, afectará a todos los directorios del dominio, pues este archivo modifica el directorio que lo contiene y todos los subdirectorios.

El mecanismo para crear unas redirecciones pensadas para un mejor posicionamiento en buscadores es el siguiente. En el archivo .htaccess se define una regla de redirección interna, con esta sintaxis:

RewriteRule url_patron url_destino

RewriteRule es la instrucción para definir una redirección, que recibe dos parámetros: url_patron y url_destino. En el primero se especifica una URL patrón. Cuando la dirección a la que se está accediendo cumple el patrón indicado en url_patron, se redirecciona internamente hacia la URL de destino url_destino. La página se procesa en el archivo indicado en url_destino.

El patrón es una expresión regular que corresponde con un conjunto de URLs posibles. Cuando el visitante intenta acceder a una URL que cumple esa expresión regular, internamente se procesa la página a través de la url_destino. Decimos que es un proceso interno, porque nadie se entera que la URL se está procesando a través de otro archivo, pues la dirección que aparece en el navegador siempre será la original y los buscadores no podrán detectar que Apache ha realizado una redirección interna para procesar la página.

Así pues, para los visitantes y los buscadores que indexen los contenidos de nuestra web, las direcciones que están accediendo son las amigables para buscadores, a pesar que en realidad esos documentos no existan dentro de la estructura de directorios del servidor y el procesamiento real de la página se realice en otra URL de destino.

Un ejemplo de instrucción RewriteRule podría ser el siguiente:

RewriteRule ^articulos/(.+)\.php codigo/ver_articulo.php?nombre=$1

Como se ha dicho, la primera parte es el patrón que debe cumplirse para que se realice la redirección interna. Dicho patrón es una expresión regular que tiene una sintaxis especial.

Nota: La parte más complicada del trabajo con RewriteRule de htaccess es justamente la creación de las expresiones regulares. Nosotros no vamos a explicar en este artículo la creación de expresiones regulares, pues resulta bastante compleja, pero realizaremos suficientes ejemplos como para conocer los casos más típicos. No obstante, existen referencias sobre expresiones regulares que podemos visitar para obtener más información. Visitar la categoría de expresiones regulares en nuestro directorio.

La dirección que se está accediendo en el servidor (URL) tiene que concordar con la expresión regular para que se realice la redirección. En la primera parte de la instrucción RewriteRule del ejemplo indicado anteriormente teníamos esta expresión regular:

^articulos/(.+)\.php

Para explicar esta expresión regular creo que es mejor verla por partes.

La primera parte sería "^articulos/". Esto quiere decir todas las URL que comiencen por "articulo/" (la palabra artículo seguida de una barra). El carácter ^ significa el comienzo de una expresión.

La segunda parte es (+.). El "+" significa una o más repeticiones de algo. El "." significa cualquier carácter, luego "+." significaría uno o más repeticiones de cualquier carácter, es decir, cualquier conjunto de uno o más caracteres. El paréntesis sirve para agrupar expresiones. Luego veremos para qué nos puede servir esa agrupación.

Por último, en la expresión regular tenemos "\.php". La contrabarra es un carácter de escape que sirve para que el "." siguiente no sea considerado como cualquier carácter, sino como un punto sin más. Entonces, esto quiere decir ".php".

En conjunto la expresión regular significa cualquier cosa que empiece por "articulos/", seguido de cualquier carácter o conjunto de caracteres, seguido de ".php".

Con esta expresión regular concordarían URLs como estas:

articulos/loquesea.php
articulos/otra-cosa.php
articulos/1234-xx_zz.php

Decíamos que la parte con el (+.) quiere decir cualquier carácter o conjunto de caracteres. Además, con este "comodin" se puede construir la url_destino. Fijémonos en la segunda parte del RewriteRule:

codigo/ver_articulo.php?nombre=$1

Simplemente se ha indicado otra dirección donde hay un archivo PHP que se va a encargar de procesar todas las URLs que cumplan el patrón explicado anteriormente. Si nos fijamos, dentro de la url_destino tenemos un $1. Esta variable se sustituye por lo que había dentro del (+.) indicado en el patrón de la expresión regular.

Por ejemplo, una url de esta forma:

www.dominio.com/articulos/plantas-medicinales.php

Se procesará en la dirección:

www.dominio.com/codigo/ver_articulo.php?id=plantas-medicinales

Si nos fijamos, la URL de destino realiza el paso de parámetros, para que todos los artículos se procesen en el mismo archivo, indicando en la dirección algo que sirva para identificar inequívocamente el artículo que se desea ver. Sin embargo, ese paso de parámetros se realizará internamente y de manera transparente para el usuario que estará teniendo la impresión que la URL que está procesando es la original que ha escrito en la barra de direcciones del navegador.

Como se ha visto, el $1, extraído de la URL original en la parte del patrón de la expresión regular que se corresponde con el (+.), se utiliza para construir la URL que se va a encargar de procesar la página.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

cesar

04/5/2007
Saludos amigos, muy bueno el articulo, pero creo que hay un pequeño error, donde dice:

www.dominio.com/codigo/ver_articulo.php?id=plantas-medicinales

deberia de decir:

www.dominio.com/codigo/ver_articulo.php?nombre=plantas-medicinales

el nombre de variable Id, sinceramente no se de donde salio.

Espero estar en lo correcto. Gracias por su tiempo.

Yobani

25/9/2008
Estoy probando el mismo ejemplo y no me funciona si me funciona el redirect pero no me funciona me muestra un error q no se puede mostrar la pagina

Nosferatus

30/5/2009
Es correcto
Hola, "id" es correcto, podría ser cualquier cosa, "hierbajo", "agua", "piedra", el nombre "id" es decisión del programador al crear el código.

Saludos

manel

04/9/2009
RewriteRule ^([[:space:]a-zA-Z0-9_-]+)[/]*$ page.php?pseudo=$1
como hago para que funcione en IIS ?????

Victor

19/12/2009
CUidado con las rutas relativas
Gracias por el tutorial. No fue fácil entender la parte de las expresiones regulares de htaccess pero apliqué lo aprendido en http://www.puromotor.cl y logré el objetivo que estaba buscando. De todas maneras les doy un consejo: tengan cuidado al simular directorios porque si la página tiene rutas relativas (por ejemplo a los archivos css o js) no encontrará los archivos. Saludos.

blankriv

26/5/2010
No puedo redireccionar
Por favro me podrian ayudar a redireccionar estas urls para volverlas amigables, ya me leido varios post y siempre me generan error:

http://www.pineislandchiropractic.com/index2in.php?link=about.htm

http://www.pineislandchiropractic.com/prueba/ES/index2es.php?link=preguntas.htm

Options +FollowSymLinks
RewriteEngine on

RewriteRule ^([A-Za-z0-9-]+)/?$ index2in.php ?link=$1 [L]
RewriteRule ^/(.+).php /index2in.php ?link=$1

RewriteRule ^es/(.+).php prueba/ES/index2es.php ?link=$1

RewriteRule ^es/([A-Za-z0-9-]+)/?$ index2fr.php ?link=$1 [L]

nandom

04/6/2010
ayuda con htaccess
queria saber como hacer una regla para que cualquier url por ejemplo
www.midominio.com/letrasnumeros-guiones_subguiones
toda letra digito guion o subguion es aceptable
ahora si mi url tiene algun signo de puntuacion a parte de los que se menciono antes tiene que mandarme a mi pagina de error por ejemplo
www.midominio.com/letra:*digito-letra
esto me tendria que mandar a la pagina de error
mi Expresion regular es la siguiente

RewriteRule ([^a-zA-Z0-9-/]+)+/?$ index.php?page=error[L]
con esta expresion me manda a mi pagina de error en los siguientes casos:
www.midominio.com/letras:*
www.midominio.com/numeros:*
pero si acaba en una letra o numero no me manda a la pagina de error
www.midominio.com/:*letras-numeros
no que se puedo añadir o cambiar en mi expresion regular

cesar

20/4/2011
asunto de url amigables
cuando editas las urls por urls amigables el mapa de sitie se genera con las urls amigables o con las urls de inicio.alguien podria contestarme esa duda

ser

18/2/2014
Gracias
gracias me a sido de gran ayuda

Cristian Cuervo

25/10/2014
Problema...
Hola..
Soy nuevo en el manejo del .htaccess... Tengo este codigo para url amigable
RewriteEngine on
RewriteRule /(.*)/$ index.php?id=$1
pero no me funciona.. no hace absolutamente nada.. ni en local ni en servidor web... no se si hay q configurar algun archivo o algo...
alguien podria ayudarme por favor ?
Quisiera que cuando genere el index.php?id=organizacion me muestre algo como esto
organizacion.html o algo como organizacion/
Gracias.. estoy un poco urgido...

Jorge

20/9/2018
.htaccess
Buenas, estoy trabajando bajo un subdominio y tengo que hacer una web multilingüe.
Esta es la URL:
http://prueba.arristudioa.com/ALEX_TXIKON/adventure-master/index.php?lang=en

Y mi archivo .htaccess metido en la carpeta del subdominio:
RewriteEngine on
RewriteRule ^index/(.+).php index.php?lang=$1 [L]

La cosa que no me funciona.
Me puedes ayudar??