Reescribir URL con mod_rewrite y otros RewriteEngine

Un RewriteEngine es un componente de software de un servidor web que permite reescribir o redireccionar URL. Su denominación está compuesta por los términos procedentes del inglés “rewrite” (reescribir) y “engine” (máquina, motor). El más conocido es el mod_rewrite del servidor HTTP Apache, aunque también otros servidores web como nginx o lighttpd disponen de estas funciones.

Este módulo de reescritura encuentra aplicación cuando, por ejemplo, hay que transformar una dirección URL inmanejable, como las que generan los sistemas de gestión de contenidos, en URL amigables. Los motivos saltan a la vista. Veamos estas dos direcciones:

"http://ejemplo.com/a/index.php?title=titulodelapagina"

"http://ejemplo.com/articulo/titulodelapagina"

Las direcciones generadas técnicamente, como la primera, son difíciles de recordar por los usuarios, pero un RewriteEngine permite que el mismo recurso esté disponible de forma paralela bajo una dirección URL mucho más sencilla, como vemos en la segunda línea.

De esta forma, un internauta también puede hacer uso de este URL para ir a la página correspondiente. Cuando el servidor web recibe una petición de este tipo, el RewriteEngine reescribe automáticamente el URL según el esquema que usa el servidor internamente (primera dirección del ejemplo anterior).

Podría decirse que el software crea una especie de capa de abstracción que se sitúa entre los URL que el proyecto web utiliza a nivel interno y aquellos que se muestran de forma pública en la red; esto es lo que permite mostrar un esquema de direcciones unitario y amigable independientemente de los requisitos técnicos. Mientras que internamente la dirección dinámica puede seguir usándose, el usuario tiene la posibilidad de acceder a una página con una dirección aparentemente estática, cuya ventaja radica en que sigue siendo válida incluso cuando se realicen cambios internos en la jerarquía de los archivos.

Otro de los beneficios de los RewriteEngine para los operadores web es que permite implementar desvíos en función de determinadas condiciones. Esto permitiría, por ejemplo, configurar una redirección para implementar una acción de geotargeting o para mostrar páginas web optimizadas específicamente para ciertos terminales, basándose en la identificación del agente de usuario o en la dirección IP del cliente que realizó la petición. Aquí suele usarse una redirección 301 que garantiza, a pesar del funcionamiento en paralelo de páginas móviles adicionales o de versiones en diferentes idiomas, que se almacene únicamente una versión en el índice del buscador. En cualquier caso habría que distanciarse de prácticas como el cloaking, con la cual se optimizan páginas web exclusivamente en función de la araña del buscador para lograr un buen posicionamiento.

Cómo se utiliza un RewriteEngine

Un software de URL rewriting dispone de varios comandos para la manipulación de URL que se pueden introducir en diferentes lugares del software del servidor web. Mod_Rewrite, el software del servidor web Apache, puede utilizarse en un contenedor de directorios dentro de httpd.conf, en un apartado del VirtualHost o dentro del archivo .htaccess. En el servidor nginx la reescritura de URL se nota en el archivo de configuración /etc/nginx/nginx.conf, y en lighttpd se puede hacer en el archivo de la configuración del vHost /etc/lighttpd.conf.

Siguiendo el ejemplo inicial, el camino que lleva de la primera a la segunda dirección sigue, en función de si se usa un RewriteEngine en un servidor Apache, nginx o lighttpd, diferentes comandos.

RewriteEngine con Apache

Para usar mod_rewrite con Apache hay que activar el RewriteEngine con la directiva RewriteEngine on. A continuación, se introduce la regla de reescritura RewriteRule, en la cual se definen las indicaciones de reescritura por medio de las denominadas “expresiones regulares” („regular expressions“, Regex):

RewriteEngine on
RewriteRule ^/articulo/(.*)$ /a/index.php?title=$1

Si se quiere definir un desvío con una RewriteRule, esta contiene dos parámetros fundamentales: pattern (origen) y substitution (destino).

  • Pattern: este parámetro describe a los URL que han de ser redireccionados. Para ello se define una condición específica en la forma de una cadena de caracteres. Si se cumple esta condición, se realiza el desvío al URL indicado en el parámetro de destino. En nuestro ejemplo anterior este patrón corresponde al fragmento de la RewriteRule: ^/artikel/(.*)$.
  • Substitution: este describe al URL de destino. Si la redirección se configura a nivel de servidor la substitución afecta al URL completo. Si se realiza a nivel del directorio en el archivo .htaccess o dentro del httpd.conf, solo se sustituye el fragmento del URL a partir del directorio actual. En el ejemplo corresponde a este fragmento: /a/index.php?title=$1.

En la siguiente tabla se muestran los significados de las expresiones regulares utilizadas en el ejemplo:

Expresiones regulares Significado
^ Indica el comienzo de una secuencia.
$ Marca el final de una secuencia.
(.*) Marcador para cualquier sucesión de caracteres dentro de un URL. Los paréntesis guardan la sucesión en una variable.
$1 Una variable que permite acceder a valores almacenados por los paréntesis en una memoria intermedia.

La RewriteRule ^/articulo/(.*)$ /a/index.php?title=$1 define así la norma de que, en todos los URL que comiencen con la secuencia /articulo/(.*), este fragmento se sustituya por el esquema dinámico /a/index.php?title=$1, donde $1 equivale a la sucesión de caracteres almacenada en el marcador (.*). Cuando un usuario introduce el URL estático "http://ejemplo.com/articulo/titulodelapagina" en el navegador, el servidor web la reescribe basándose en mod_rewrite de forma interna e invisible para el usuario, convirtiéndola en la dirección dinámica "http://ejemplo.com/a/index.php?title=titulodelapagina";. El marcador (.*) y la variable $1 corresponden, en este caso, a la secuencia de caracteres „titulodelapagina“. Si la reescritura ha de ir vinculada a determinadas opciones que controlan el comportamiento de mod_rewrite, se notan entre corchetes a continuación de la RewriteRule y separadas por comillas si se trata de varias opciones. De esta manera pueden implementarse también redirecciones externas usando los códigos de estado HTTP. La siguiente tabla muestra una selección de opciones para la RewriteRule. La lista completa se encuentra en la página oficial de la Apache Software Foundation.

Opción Bandera (flag) Función
Redirect (redirigir) R La bandera [R] indica al servidor web que ha de llevar a cabo un desvío externo mediante el código de estado HTTP 302. Si se ha de enviar un código de estado diferente, se añade a la bandera con el signo matemático “igual a” (p. ej. [R=301)].
Forbidden (prohibido) F Ordena al servidor web enviar el código de estado 403 (prohibido) al navegador web.
Gone (no existe) G Ordena al servidor web transmitir al navegador el código de estado 410 y marca la página web solicitada como no disponible.
Last (última) L Indica al servidor web no ejecutar más reglas tras la actual RewriteRule.
Nocase NC Al comprobar si un URL cumple las condiciones para la reescritura no se atiende a mayúsculas o minúsculas.
Chain C Solo se tendrá en cuenta a la siguiente RewriteRule si se cumple la condición actual.

Según estas opciones, una redirección externa por medio de códigos de estado HTTP se realiza de la siguiente forma:

RewriteEngine On
RewriteRule ^paginavieja.html$ /paginanueva.html [R=301]

Junto a las RewriteRules, con el módulo de Apache también se pueden definir las denominadas RewriteConds, con las cuales los operadores web fijan las condiciones adicionales que se han de cumplir para que se pueda llevar a cabo el proceso de reescritura.

La sintaxis de una RewriteCond sigue el siguiente esquema y se sitúa por delante de la RewriteRule:

RewriteCond TESTSTRING CONDITION

La secuencia Teststring contiene por lo general las llamadas variables del servidor definidas por un signo de porcentaje y claves: %{HTTP_HOST}. La siguiente tabla muestra una selección de variables:

Variable del servidor Significado
HTTP_USER_AGENT Se refiere al cliente que se utiliza para acceder al servidor. Esta variable suele usarse para poner a disposición de diferentes navegadores web (agentes de usuario) una página web optimizada para cada uno.
HTTP_HOST Hace referencia al nombre del host, que puede contener valores como dominio.com, subdominio.dominio.com o la dirección IP.
SERVER_PORT Se refiere al puerto de destino, por ejemplo, 80 para HTTP o 443 para HTTPS. Esta variable permite a los operadores web desviar a las visitas a una conexión segura.
REMOTE_ADDR Hace alusión a la dirección IP de un usuario con acceso al servidor web. Suele usarse para bloquear ataques de spam.

El siguiente ejemplo muestra una RewriteCond, que vincula la RewriteRule consecutiva a la dirección IP de un usuario con acceso al servidor:

RewriteCond %{REMOTE_ADDR} 173.45.68.79

URL rewriting con nginx

El servidor web nginx también soporta de forma nativa la reescritura de URL, realizada asimismo con ayuda de expresiones regulares. El comando de reescritura se añade sencillamente, siguiendo la sintaxis nginx, en un bloque { [...] } en el archivo de configuración del servidor web /etc/nginx/nginx.conf:

location /articulo {
 rewrite ^/articulo/(.*)$ /index.php?title=$1 last;
}

La secuencia location/articulo indica que la reescritura hace alusión al subdirectorio “articulo”. Las expresiones regulares que se usan aquí son las mismas que se utilizan en el servidor de Apache, y se introducen con el comando rewrite. La bandera last indica que la reescritura es interna y se ejecuta sin redirección. Las banderas también están disponibles para un desvío temporal o permanente:

Bandera (flag) Significado
last Los URL se reescriben internamente. No hay redirección.
redirect El usuario es desviado temporalmente mediante el código 302-Redirect a una nueva dirección.
permanent Con el código 301-Redirect se redirecciona al usuario de forma permanente a la nueva dirección.

Si no se utiliza ninguna bandera, nginx indica por defecto el código HTTP de error 500.

Reescritura con lighttpd

En este caso, el proceso de URL rewriting se realiza a partir de la función url.rewrite-TYP, donde el marcador TYP representa las opciones disponibles para la configuración de la reescritura:

Opción de configuración Significado
url.rewrite-once Solo se reescribe una vez. Una vez se ha encontrado el pattern y se ha reescrito en función de substitution, no se realizan más modificaciones.
url.rewrite-repeat Se diferencia del primero en que en este caso a la primera modificación sí pueden seguir otras reescrituras.

Como en un servidor lighttpd también se utilizan las mismas expresiones regulares que en mod_rewrite, la sintaxis sigue esencialmente el modelo que ya conocemos:

url.rewrite-once = (
 "^/articulo/(.*)$" => "/index.php?title=$1"
)

Si, en lugar de una reescritura interna se ha de ejecutar una redirección externa, en lighttpd no se usa el módulo de reescritura, sino un módulo de redirección, aunque, primero, los URL han de pasar por el módulo de reescritura antes de pasar el de redirección.

Reescritura de URL con Microsoft IIS

La plataforma Microsoft Internet Information Services (IIS) no posee ningún software nativo de reescritura, pero se puede añadir posteriormente al servidor web con la extensión Modul IIS URL Rewrite 2.0. De esta forma, los usuarios de Microsoft también pueden poner a disposición de sus visitas URL amigables sin tener que adentrarse en la gestión interna de archivos. Una vez descargada, esta extensión de reescritura se integra en la interfaz IIS Manager, donde se pueden introducir RewriteRules en una interfaz de usuario gráfica. Este módulo también utiliza expresiones regulares para definir patterns y substitutions.

URL rewriting y optimización para los buscadores

La posibilidad de transformar URL parametrizadas en direcciones más accesibles es origen de una discusión a propósito de las funciones de mod_rewrite, así como de las versiones en otros servidores, en relación con el SEO. ¿Pueden evaluarse los URL amigables como factor de ranking? No hay pruebas inequívocas de que haya una relación directa, pero está claro que existe un efecto indirecto. Al contrario que las direcciones demasiado crípticas, las URL reescritas permiten a los usuarios deducir a dónde dirige un enlace determinado, de tal forma que la reescritura puede ser utilizada para construir confianza y aumentar, así, la tasa de clics. Y no solo eso, puesto que las palabras clave de búsqueda se muestran en negrita en los URL en la lista de resultados, lo que añade una motivación adicional a hacer clic en una dirección y no en otra.

¿Le ha resultado útil este artículo?
Page top