0

Redireccionamiento web en IHS y Apache

Redireccion 301Este post aplica a los servidores web IBM HTTP SERVER y Apache. La diferencia es que los primeros modificaremos el fichero de configuración httpd.conf y en el segundo el fichero .htaccess

El módulo mod_rewrite de IHS (y Apache) nos permite redirigir de forma transparente una URL a otra sin que el usuario lo note. Esto nos abre un mundo de posibilidades, desde redirigir una vieja URL a otra nueva  hasta adecentar esas URLs feas que crean algunos sistemas de publicación (como el WebSphere Portal Server) convirtiéndolas en URLs mucho más amigables para los usuarios y los motores de búsqueda.

Introducción al Rewriting

Un Sitio Web bien diseñado debería tener un FileSystem ordenado de una manera lógica, con nombres de directorios y ficheros coherentes. Los usuarios de la web deberían ser capaces de llegar a dichos ficheros usando la lógica con un alto índice de acierto.

Sin embargo, existen casos que impiden que una URL sea todo lo “amigable” que deseamos. Muchos Gestores de Contenido usan URLs como

http://www.ejemplo.com/vercatalogo.jsp?categoria=coches&prodID=53

Existen varios problemas con este tipo de URLs:

  • Revela el tipo de tecnología que estamos usando. Esto da pistas a los hackers sobre el tipo de datos que deben enviar en su query para llevar a cabo un ataque a nuestro Sitio web. La tecnología que usemos en nuestro Sitio Web es totalmente irrelevante para el usuario final, así que lo mejor es que se oculte siempre que sea posible. Si, además, decidimos cambiar la tecnología que usamos en el Sitio (por ejemplo a ASP), todas nuestras URLs anteriores dejarán de funcionar…
  • La URL usa signos “poco elegantes”, como la interrogación y el ampersand. Estos últimos son especialmente problemáticos porque si alguien nos enlaza usando esta URL, aquellos ampersands no escapados estropearán la validación XHTML del  Sitio Web que nos enlace. Para evitarlo tendrían que reemplazar todos los ampersands por  &, algo que muchas veces se olvida.
  • Algunos motores de búsqueda no indexarán páginas generadas dinámicamente. Esto sucederá cuando vean esas interrogaciones en las URLs.

Afortunadamente, gracias al Rewriting podemos “limpiar” esas URLs y convertirlas en algo como

http://www.ejemplo.com/catalogo/coches/53/

Este tipo de URLs son más lógicas, claras, se recuerdan más fácilmente y serán indexadas por cualquier motor de búsqueda. La descripción de los directorios es corta y sencilla y, más importante, parecen más permanentes.

El uso de mod_rewrite es sencillo: se le pasa como parámetro el texto que queremos reemplazar y la URL real a la que redirigiremos. Las URLs que queremos sustituir pueden ser absolutas (aplican para un fichero) o expresiones regulares (aplican para varios ficheros).

Rewriting básico

Si no tenemos activado el mod_rewrite por defecto tendremos que acivarlo en nuestro fichero httpd.conf (.htaccess en caso de Apache). Bastará con descomentar la línea correspondiente

LoadModule rewrite_module modules/mod_rewrite.so

y usar el comando

RewriteEngine on

Redirecciones básicas

Se trata de la redirección más simple. Se utiliza si hemos movido un fichero a un nuevo directorio y queremos que todos los enlaces que apuntaban al directorio antiguo sean redirigidos al nuevo. A pesar de que hay que tratar de evitar mover ficheros una vez que se han publicado en el Sitio Web, hay veces que es inevitable…

RewriteEngine on
RewriteRule ^old\.html$ new.html

Este es el caso más simple que nos vamos a encontrar. La única complejidad que nos encontramos aquí es crear la estructura de la URL antigua. Hay que prestar especial atención a tres cosas:

  • La careta, ^, representa el comienzo de la URL, bajo el directorio actual. Este directorio es aquel en el que se encuentre el fichero httpd.conf.
  • El símbolo del dolar, $, significa el final del string a buscar. Es necesário ponerlo para que nuestra regla se detenga aquí y no siga buscando este string en URLs más largas.
  • El punto antes de la extesión de fichero es una expresión regular y significa otra cosa si no lo escapamos con un backslash, que le indica al IHS que tienen que ser tratado como un caracter normal.

De esta manera, esta regla hace que nuestro IHS redirija de forma transparente de old.html a new.html . El usuario no tendrá ni idea de lo que ha sucedido porque la ejecución es instantánea.

Forzado de nuevas peticiones

Hay veces que es recomendable hacer saber al usuario que hemos hecho una redirección. Esto se puede hacer forzando una petición HTTP para la nueva página. Esto hará que el navegador cargue la nueva página como si fuera la que se ha solicitado servir originariamente y en la barra de navegación cambiará la URL que se muestra. Todo lo que hay que hacer es usar el flag [R], poniéndolo tras la regla que hemos escrito antes:

RewriteRule ^old\.html$ new.html [R]

Las expresiones regulares

Aquí empieza lo bueno. Toda la potencia de mod_rewrite se consigue sin renunciar a una buena porción de complejidad, para nuestra desgracia. Si no estáis familiarizados con las expresiones regulares os resultarán un poco difíciles de entender al principio, pero realmente vale la pena el esfuerzo.

La ventaja de las expresiones regulares es que nos permiten crear reglas que afecten a varias URLs a la vez, redirigiéndolas masivamente a las nuevas páginas. Por ejemplo:

RewriteRule ^products/([0-9][0-9])/$ /productinfo.jsp?prodID=$1

Esto afectará a las URLs que comiencen por products/, seguidas por dos dígitos cualesquiera, seguidos por un slash. Más concretamente, esta regla afectará a URLs como products/12/ ó products/99/ y redirije a la página del producto.

Lo que aparece entre corchetes se llama rango. En este caso concreto estamos permitiendo un dígito comprendido entre 0 y 9 (cualquier dígito, vamos). Otros rangos podrían ser [A-Z], que significaría cualquier letra mayúscula; [a-z], cualquier minúscula; y [A-Za-z], cualquier letra mayúscula o minúscula.

Hemos metido entre paréntesis la expresión regular de la URL porque queremos almacenar cualquier valor que signifique para un uso posterior. En este ejemplo enviamos su valos a una página JSP como argumento. Siempre que tengamos un valor entre paréntesis podremos usarlo a través de una back-reference. Cada una de las partes metidas entre paréntesis recibe un índice, empezando por el uno. De esta forma, la primera back-reference es $1, la segunda es $2, etc…

Así, una vez realizada la redirección, la página cargada en el navegador del usuario será algo parecido a productinfo.jsp?prodID=12.Por supuesto, estamos manteniendo esta URL real oculta al usuario.

Redirecciones múltiples

Si el visitante de nuestro Sitio Web ha tecleado algo así como products/12,la regla de arriba no va a funcionar porque falta el slash del final. Para evitar que esto suceda haremos una redirección directa a la misma URL con el slash.

RewriteRule ^products/([0-9][0-9])$ /products/$1/ [R]

Se pueden aplicar múltiples redirecciones en secuencia en el mismo fichero httpd.conf, que es lo que estamos haciendo en este ejemplo. Esta regla se añadiría sobre la que hemos hecho en el ejemplo anterior, quedando algo tal que así:

RewriteRule ^products/([0-9][0-9])$ /products/$1/ [R]
RewriteRule ^products/([0-9][0-9])/$ /productinfo.jsp?prodID=$1

Así, si el usuario teclea la URL products/12 se activa nuestra primera regla, reescribiendo la URL para incluir el slash del final y haciendo una nueva request a products/12/para que el usuario pueda ver que nos gustan los slash al final. Es entonces cuando la segunda regla se activa (al detectar la URL con el slash) y, de forma transparente, redirige esta URL a productinfo.jsp?prodID=12

Modificadores

Podemos ampliar el uso de las expresiones regulares añadiendo algunos caracteres modificadores, que nos permitirán ajustarnos a URLs mucho más largas. En los ejemplos de arriba sólo permitíamos dos números después de products. No es el ejemplo más indicado, pues si nuestro Sitio Web crece lo suficiente como para ofrecer más de 99 productos y crear la URL  productinfo.jsp?prodID=100, nuestras reglas configuradas en el httpd.conf no se activarían.

En lugar de picar un montón de código para poder cubrir todos los dígitos vamos a trabajar en una solución que nos permita cubrir cualquier número que introduzca el usuario. Esta es la regla que lo permite:

RewriteRule ^products/([0-9]+)$ /products/$1/ [R]

El símbolo más (+) es el que obra el milagro aquí. Es un modificador que cambia todo lo que venga delante de él, de la forma “uno o más de los caracteres o rangos precedentes“. En este caso en concreto la regla se va a activar con cualquier URL que comience con  products/ y termine con al menos un dígito. Esto incluiría products/1 y products/1000

Otros modificadores que podemos usar del mismo modo son el asterisco, *, que significa “cero o más caracteres o rangos precedentes” y la interrogación, ?, que significa “cero o sólo uno de los caracteres o rangos precedentes“.

URLs intuitivas

Gracias a estos simples comandos podemos configurar una lista de “accesos rápidos” para las URLs que creamos que van a visitar nuestros usurios. Por ejemplo, imaginemos que muchos usuarios acceden a nuestras hojas de estilo mediante la URL http://wwww.ejemplo.com/css/ . Podemos capturar estos casos  e informar al usuario de la dirección correcta actualizando la barra de navegación. Esto lo hacemos con estas líneas:

RewriteRule ^css(/)?$ /stylesheets/ [R]

La expresión regular de este ejemplo se activa si el usuario introduce css con o sin slash al final. La interrogación, como hemos hablado antes, significa “cero o sólo uno de los caracteres o rangos precedentes“.

Gracias al uso de expresiones regulares controlaremos la aparición de errores 404 en nuestro Sitio Web, logrando a la vez una navegación más fluida y coherente.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *