Creating Rewrite Rules for the URL Rewrite Module (Creación de reglas de reescritura para el módulo URL Rewrite)
por Ruslan Yakushev
El Módulo URL Rewrite es una extensión de IIS que está disponible como descarga para su servidor IIS independiente y también está preinstalado en cualquier sitio web de Sitios web de Windows Azure (WAWS) y disponible para su uso. Este tutorial le guiará por la creación y la prueba de un conjunto de reglas de reescritura para el Módulo URL Rewrite.
Requisitos previos
Para poder seguir este tutorial, es necesario reunir los siguientes requisitos previos:
- IIS 7 o posterior con el servicio de rol ASP.NET habilitado.
- Módulo URL Rewrite instalado. Para más información, consulte uso del Módulo URL Rewrite.
Configuración de una página web de prueba
Para demostrar cómo funciona el Módulo URL Rewrite, usaremos una página ASP.NET de prueba sencilla. En esta página se leen las variables de servidor web y se generan sus valores en el explorador.
Copie el siguiente código ASP.NET y colóquelo en la carpeta %SystemDrive%\inetpub\wwwroot\ en un archivo denominado article.aspx:
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>URL Rewrite Module Test</title>
</head>
<body>
<h1>URL Rewrite Module Test Page</h1>
<table>
<tr>
<th>Server Variable</th>
<th>Value</th>
</tr>
<tr>
<td>Original URL: </td>
<td><%= Request.ServerVariables["HTTP_X_ORIGINAL_URL"] %></td>
</tr>
<tr>
<td>Final URL: </td>
<td><%= Request.ServerVariables["SCRIPT_NAME"] + "?" + Request.ServerVariables["QUERY_STRING"] %></td>
</tr>
</table>
</body>
</html>
Después de copiar este archivo, vaya a http://localhost/article.aspx
y compruebe que la página se ha representado correctamente en un explorador.
Creación de una regla de reescritura
Crearemos una regla de reescritura sencilla que reescribirá las direcciones URL con el formato siguiente:
http://localhost/article/342/some-article-title
a:
http://localhost/article.aspx?id=342&title=some-article-title
.
Crearemos una regla de reescritura mediante la interfaz de usuario de reescritura de direcciones URL en el Administrador de IIS. Para ello, siga estos pasos:
- Vaya al Administrador de IIS.
- Seleccione Sitio web predeterminado.
- En la vista de características, haga clic en Reescritura de URL.
- En el panel Acciones del lado derecho, haga clic en Agregar reglas...
- En el cuadro de diálogo Agregar reglas, seleccione Regla en blanco y haga clic en Aceptar.
Ahora debe definir la regla de reescritura real. En el Módulo URL Rewrite, se define una regla de reescritura especificando cuatro fragmentos de información necesarios:
- Nombre de la regla.
- Patrón que se va a usar para buscar coincidencias con la cadena de URL
- Conjunto opcional de condiciones.
- Acción que se va a realizar si un patrón coincide y si todas las comprobaciones de condiciones se realizan correctamente.
Nombre de una regla
En el cuadro de texto Nombre, escriba un nombre que identifique de forma única la regla, por ejemplo: "Reescribir a article.aspx".
Definición de un patrón
En el cuadro de texto Patrón, escriba la cadena siguiente:
^article/([0-9]+)/([_0-9a-z-]+)
Esta cadena es una expresión regular que especifica que el patrón coincidirá con cualquier cadena de dirección URL que cumpla las condiciones siguientes:
- Comienza con la secuencia de caracteres "article/".
- Contiene uno o varios caracteres numéricos después del primer "/".
- Contiene uno o varios caracteres alfanuméricos o "_" o "-" después del segundo "/".
Observe que algunas partes de la expresión regular están entre paréntesis. Estos paréntesis crean grupos de capturas, a los que se puede hacer referencia más adelante en la regla mediante referencias inversas.
Definición de una acción
Como la regla que estamos creando debe reescribir la dirección URL, elija el tipo de acción Rewrite que aparece en el cuadro de grupo Acciones. En el cuadro de texto Reescritura de URL, escriba la cadena siguiente:
article.aspx?id={R:1}&title={R:2}
Esta cadena especifica el nuevo valor al que se debe volver a escribir la dirección URL de entrada. Observe que para los valores de los parámetros de cadena de consulta que usamos {R:1} y {R:2}, que son referencias inversas a los grupos de captura definidos en el patrón de regla mediante paréntesis.
Deje los valores predeterminados restantes. La página de propiedades Editar regla de entrada debe ser similar a la página siguiente:
Guarde la regla haciendo clic en Aplicar en el lado derecho.
Visualización de la regla de reescritura en el archivo de configuración
Las reglas de reescritura se almacenan en el archivo ApplicationHost.config o en los archivos Web.config. Para comprobar la configuración de la regla que acabamos de crear, abra un archivo Web.config ubicado en %SystemDrive%\inetpub\wwwroot. En este archivo debería ver la sección <rewrite>
que contiene esta definición de regla:
<rewrite>
<rules>
<rule name="Rewrite to article.aspx">
<match url="^article/([0-9]+)/([_0-9a-z-]+)" />
<action type="Rewrite" url="article.aspx?id={R:1}&title={R:2}" />
</rule>
</rules>
</rewrite>
La sintaxis anterior también se aplica a la configuración de URL Rewrite in Web.config en Windows Azure Web Sites (WAWS).
Prueba de la regla de reescritura
Para probar que la regla reescribe correctamente las direcciones URL, abra un explorador web y solicite la siguiente dirección URL:
http://localhost/article/234/some-title
Debería ver que la regla de reescritura en el servidor web ha cambiado la dirección URL original a Article.aspx y ha pasado "234" y "some-title" como valores para los parámetros de cadena de consulta.
Creación de una regla de redirección
Ahora crearemos una regla de redirección que redirigirá todas las direcciones URL con el formato siguiente:
http://localhost/blog/some-other-title/543
al siguiente formato:
http://localhost/article/543/some-other-title
Una regla de redireccionamiento permite que más de una dirección URL apunte a una sola página web.
Para ello, abra la interfaz de usuario de la vista de características de reescritura de direcciones URL en el Administrador de IIS. Haga clic en Agregar reglas...y, a continuación, vuelva a seleccionar la plantilla Regla en blanco.
En la página Editar regla, escriba lo siguiente:
- Nombre: Redirección desde el blog (este es un nombre único para la regla).
- Patrón: ^blog/([_0-9a-z-]+)/([0-9]+) (Este patrón coincidirá con la cadena de dirección URL que comienza por "blog" y captura los segundos y terceros segmentos de la dirección URL en referencias inversas).
- Acción: Redirección (la acción de redirección hará que se devuelva una respuesta de redirección al explorador).
- Dirección URL de redireccionamiento: article/{R:2}/{R:1} (Esta cadena de sustitución se usará como dirección URL de redirección; tenga en cuenta que usa referencias inversas para conservar y reorganizar las partes de dirección URL originales capturadas durante la coincidencia de patrones).
Escriba el nombre, el patrón y la acción, como se muestra a continuación:
Escriba la dirección URL de redireccionamiento como se muestra a continuación:
Deje los valores predeterminados restantes. Guarde la regla haciendo clic en Aplicar en el lado derecho.
Prueba de la regla de redireccionamiento
Para probar que la regla redirige correctamente las solicitudes, abra un explorador web y solicite la siguiente dirección URL:
http://localhost/blog/some-other-title/323
Debería ver que el explorador se redirigió a http://localhost/article/323/some-other-title
como resultado de la ejecución de la regla de redireccionamiento y, a continuación, la solicitud se reescribió de acuerdo con la regla de reescritura que ha creado anteriormente.
Creación de una regla de bloqueo de acceso
La tercera regla que crearemos se usa para bloquear todas las solicitudes realizadas a un sitio web si esas solicitudes no tienen establecido el encabezado host. Este tipo de regla es útil cuando desea evitar intentos de piratería que se realizan mediante la emisión de solicitudes HTTP en la dirección IP del servidor en lugar de usar el nombre de host.
Crearemos esta regla sin usar el Administrador de IIS. Abra el archivo Web.config en la carpeta %SystemDrive%\inetpub\wwwroot\
que usó para el archivo de prueba de article.aspx antes en este artículo. Localice la sección <rewrite>
. Inserte la siguiente regla en la colección de <reglas>, de modo que sea la primera regla de la colección:
<rule name="Fail bad requests">
<match url=".*"/>
<conditions>
<add input="{HTTP_HOST}" pattern="localhost" negate="true" />
</conditions>
<action type="AbortRequest" />
</rule>
La sección <rewrite>
debe ser similar al código siguiente:
<rewrite>
<rules>
<rule name="Fail bad requests">
<match url=".*"/>
<conditions>
<add input="{HTTP_HOST}" pattern="localhost" negate="true" />
</conditions>
<action type="AbortRequest" />
</rule>
<rule name="Redirect from blog">
<match url="^blog/([_0-9a-z-]+)/([0-9]+)" />
<action type="Redirect" url="article/{R:2}/{R:1}" redirectType="Found" />
</rule>
<rule name="Rewrite to article.aspx">
<match url="^article/([0-9]+)/([_0-9a-z-]+)" />
<action type="Rewrite" url="article.aspx?id={R:1}&title={R:2}" />
</rule>
</rules>
</rewrite>
Analicemos la regla para comprender lo que hace.
<match url=".*"/>
El elemento anterior indica que la regla coincidirá con cualquier cadena de dirección URL.
<add input="{HTTP_HOST}" pattern="localhost" negate="true" />
El elemento anterior agrega una condición a la regla que recupera el valor del encabezado host leyendo la variable de servidor HTTP_HOST, lo hace coincidir con el patrón "localhost" y, a continuación, niega el resultado de la coincidencia. En otras palabras, la condición comprueba que el encabezado host no coincide con "localhost".
<action type="AbortRequest" />
El elemento anterior indica al Módulo URL Rewrite que finalice la solicitud HTTP.
Prueba de la regla de bloqueo de acceso
Para probar esta regla, abra un explorador web y realice una solicitud a http://127.0.0.1/article/234/some-title
. Lo que debería ver es un explorador que no recibe ninguna respuesta del servidor. Sin embargo, si solicita http://localhost/article/234/some-title
, el servidor web responderá correctamente.
La presentación incorrecta será la siguiente:
La presentación correcta será la siguiente:
Resumen
En este tutorial, ha aprendido a configurar reglas de reescritura de direcciones URL mediante el Administrador de IIS o mediante la edición manual de archivos Web.config. Las reglas que se crearon en este tutorial mostraron algunas de las características importantes del Módulo URL Rewrite, como la compatibilidad con expresiones regulares y la capacidad de usar encabezados HTTP y variables de servidor para tomar decisiones de reescritura.