Obtener Urls Amigables con unas líneas de .htaccess

agosto 29, 2010 | Desarrollo web, Seo

En el siguiente post práctico realizaremos un ejemplo sencillo, que podremos usar para obtener url´s amigables en nuestro sitio cuando, por las dimensiones del proyecto no hemos optado por un framework que realice ésta tarea por nosotros.
Para ello, sólo tendremos que crear un fichero de configuración de apache (.htaccess) en el directorio raiz de nuestro sitio, o añadirle unas líneas si ya lo usamos.

Supongamos, por ejemplo, que tenemos un listado de productos que hemos programado en PHP usando nuestras propias librerías y plantillas y que, actualmente luce así:

Listado de productos:
www.mipagina.com/productos/index.php
www.mipagina.com/productos/index.php?pagina=2

Detalle de un producto:
www.mipagina.com/producto/index.php?id_producto=19
www.mipagina.com/producto/index.php?id_producto=23

Nuestro objetivo será poder acceder a cada uno de los productos a través de una url única, que los distintos buscadores donde promocionemos nuestra página web puedan indexar, y que incluyan en la url un pequeño texto descriptivo, en éste caso, el nombre del producto, para que quede algo así:

www.mipagina.com/producto/Segueta-marqueteria-escolar/19
www.mipagina.com/producto/Paquete-folios-80gr/23

Para ello añadiremos a nuestro fichero .htaccess con el siguiente bloque:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /web/

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(productos/.*)$ productos/index.php/?url_params=$1
RewriteRule ^(producto/.*)$ producto-action/index.php/?url_params=$1 [L]
</IfModule>

Éste método para conseguir urls amigables trabaja usando la configuración del servidor Apache.
Para ello, tenemos que tener habilitado en nuestro servidor el módulo rewrite.

Al incluir todas las condiciones que afectan a éste módulo dentro del condicional ‘ <IfModule mod_rewrite.c> … </IfModule> ‘ nos aseguramos que el servidor no arrojará ningún error en caso de no tenerlo activado.
Lo vemos por partes.

RewriteEngine On
#Inicializa el Módulo Rewrite

RewriteBase /web/
#Indica la ruta relativa del proyecto en el servidor

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

#Éstas dos líneas evitan hacer una redirección cuando el enlace se refiere a un archivo o directorio existente, respectivamente.

Las siguientes son las ‘líneas clave’ podríamos decir.
Necesitaremos renombrar nuestra carpeta de programación, en nuestro caso a ‘productos-action/‘ y ‘producto-action/’, para que sea aquí donde redirijamos el tráfico de las urls ‘productos/…‘ y ‘producto/…‘,  ya virtuales.
Como parámetro, los controladores de éstas carpetas recibirán el resto de partes de url en forma de array, a través del parámetro ‘url_params‘.

RewriteRule ^(productos/.*)$ productos-action/index.php/?url_params=$1
RewriteRule ^(producto/.*)$ producto-action/index.php/?url_params=$1 [L]

#El ‘[L]‘ Indica que es la última línea de las definiciones, por ello es importante que siempre esté al final.

La siguiente tarea será entonces, será desglosar el parámetro url_params, para tomar el parámetro de url que necesitemos.

Donde el contenido de RequestUrl será un array con el siguiente contenido:

Para la url ‘www.mipagina.com/productos/‘ :

Array(
[0] => 'productos'
)

Para la url ‘www.mipagina.com/productos/pagina/2‘ :

Array(
[0] => 'productos',
[1] => 'pagina',
[2] => '2'
)

Para la url ‘www.mipagina.com/producto/Segueta-marqueteria-escolar/19‘ :

Array(
[0] => 'producto',
[1] => 'Segueta-marqueteria-escolar',
[2] => '19'
)

Para la url ‘www.mipagina.com/producto/Paquete-folios-80gr/23‘ :

Array(
[0] => 'producto',
[1] => 'Paquete-folios-80gr',
[2] => '23'
)

De ésta manera, para cada controlador, la posición de cada elemento del array representará el dato que necesitamos para mostrar uno u otro artículo.

Con ésta sencilla tarea, podremos optimizar nuestro sitio web, hacíendolo más indexable y sin tener que migrar nuestra aplicación ni realizar grandes cambios.
He intentado simplificar al máximo el ejemplo, por lo que no es la única forma de hacerlo ni seguramente la mejor, pero creo que es una buena forma de empezar.
¿Te resultó útil? ¡Cuentanosló!

Tags: , , , ,

Déjanos tu opinión