Cómo hacer URL legibles y útiles (Permalinks)

Cómo hacer URL legibles y útiles (Permalinks)

Un problema común en las aplicaciones web es que las URL de acceso suelen ser poco o nada inteligibles para las personas.

Muchas veces este problema los resuelve la gente con frases del calibre de «nunca van a tener que teclearla»,  o «siempre se podrá copiar y pegar», etc.

La realidad es muy distinta a lo que se piensa puesto que se teclean y se transmiten de viva voz más veces de lo que nos pensamos, además hay otras implicaciones quizás para algunos más importantes: los motores de busqueda no indexan determinados sitios o les asignan un ranking mas bajo si consideran que es contenido generado dinámicamente.

Aparecer bien posicionado en los buscadores, ciertamente, es algo que nadie puede negar que le interese.

Esta idea de URL legibles se relaciona con los famosos «alias» de servidor que los programadores solicitan para facilitar el acceso a las aplicaciones. Con este tipo de enlaces los propios desarrolladores podrán colocar dentro de su aplicación todos los alias que deseen.

De todo lo anteriormente dicho surge la idea de Permalink, o links permanentes. Este tipo de links son más fáciles de leer y evitan los conocidos enlaces rotos que quedan tan mal en las páginas web.

Un ejemplo: en vez de teclear http://apps.ejemplo.com/servletMain?noticia=23&window=full para ver una noticia sobre radares voy a poder teclear algo asi como http://apps.ejemplo.com/noticias/23 ó http://apps.ejemplo.com/noticias/radares ó  http://apps.ejemplo.com/radares como añadido si encima me equivoco al teclear la URL, en vez de llevarme a una pagina de error que no me es de gran ayuda me puede colocar en la pagina de inicio de la aplicación.

Otro ejemplo: el software que gestiona este blog. si observamos este enlace http://www.xxxxx.com/2006/a-vueltas-con-el-co2/ parece que existe una carpeta llamada «2006» y otra llamada «a-vueltas-con-el-co2» que es muy legible por el usuario.

Estas carpetas no existen en realidad son los argumentos que utiliza la aplicacion para llevarme a http://www.xxxxxxx.com/index.php?p=26 que es donde realmente reside la entrada.

¿Cómo implementarlo?

Es muy simple, requiere una configuración mínima a nivel del servidor y un desarrollo sencillo a nivel de aplicación.

Dentro de la aplicación se coloca una directiva de servidor del siguiente tipo:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Esta directiva lo único que hace es que una vez que se entre al directorio de la aplicación todo lo que se pase a continuación en la URL que no exista como directorio o fichero se le va a pasar a index.php que actuará como controlador de redirecciones.

A nivel de servidor no hay que hacer nada más.

El redirector (en este caso index.php) es un pequeño software que hay que desarrollar que se encarga de traducir lo que el usuario ha escrito en el navegador a una url que pueda entender la aplicación.

Esta traducción puede ser una simple redirección o puede ser un mapeo de argumentos en función la posición en que se pasen (en HTTP los argumentos no son posicionales sino que se referencian por nombre).

Lo mejor es ver un ejemplo de redirector sencillisimo:

<?php
         /* $_SERVER["REQUEST_URI"] es una variable de entorno del servidor que 
            contiene lo que el usuario ha tecleado en la url del navegador */
        $argumentos=split("/",$_SERVER["REQUEST_URI"]);
        switch ($argumentos[1]){
                case "noticias":
                        redirect(’http://www.barrapunto.com’);
                        break;
                case "buscador":
                        redirect (’http://www.google.es’);
                        break;
                default:
                        echo "No se encuentra la seccion ".$argumentos[0]." que busca";
        }
       /* la funcion redirect no esta definida aqui para simplificar el codigo */
?>

En este ejemplo si yo escribo algo asi http://apps.ejemplo.com/noticias/alguna_noticia me va a llevar a http://www.barrapunto.com

Si escribo http://apps.ejemplo.com/buscador/ me lleva a http://www.google.es.

Es decir todo lo que venga a continuación de http://apps.ejemplo.com (porque mi aplicación esta a nivel raiz) se va considerar como argumentos del redirector index.php.

En este caso la redirección es muy sencilla (un cambio de maquina) pero puede ser tan complicada como queramos y llevarnos a secciones concretas dentro de aplicaciones del mismo o distinto servidor.

Ventajas e Inconvenientes

Ventajas

  • Las URL son mas legibles y comprensibles por las personas
  • El número de visitas aumenta puesto que las URL son mas fáciles de trásmitir (incluso de viva voz)
  • Mejor posicionamiento en los buscadores ya que éstos no consideran igual a las URL dinamicas
  • Las URL no parecen dinámicas sino estáticas
  • Podemos tener tantos alias o atajos dentro de la aplicación como queramos
  • No tenemos errores de enlaces rotos puesto que aunque la página haya desaparecido es más facilmente controlable la situación y se puede llevar al usuario a una pagina de utilidad como por ejemplo el login

Inconvenientes

  • Requiere un trabajo extra en el desarrollo puesto que hay que implementar el redirector
  • Hay que realizar un cambio a nivel de servidor (aunque sea trivial)