Creación de reglas de salida para el Módulo URL Rewrite

Por Ruslan Yakushev

Esta sección de la documentación se aplica a la versión 2.0 del Módulo URL Rewrite para IIS 7.

Este tutorial le guiará en la creación y la prueba de una regla de reescritura de salida para la versión 2.0 del Módulo URL Rewrite.

Requisitos previos

Para poder seguir este tutorial, es necesario reunir los siguientes requisitos previos:

  1. IIS 7 o posterior con el servicio de rol ASP.NET habilitado.
  2. Versión 2.0 RC del Módulo URL Rewrite instalada.

Configuración de una página web de prueba

Para demostrar cómo funciona la versión 2.0 del Módulo URL Rewrite, usaremos una página ASP.NET sencilla. En esta página, se leen las variables del servidor web y se muestran sus valores en el explorador. También construye un hipervínculo mediante las variables de servidor y, a continuación, coloca ese vínculo en el código HTML de respuesta.

Para crear la página de prueba

  1. Cree un archivo llamado article.aspx en la carpeta siguiente:

    %SystemDrive%\inetpub\wwwroot\
    
  2. Copie el siguiente marcado de ASP.NET, péguelo en el archivo y guarde el archivo:

    <%@ 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 v2 Test</title>
    </head>
    <body>
        <h1>URL Rewrite Module v2 Test Page</h1>
        <h2>Inbound URL Rewriting</h2>
        <table>
            <tr>
                <th>Server Variable</th>
                <th>Value</th>
            </tr>
            <tr>
                <td>Original URL: </td>
                <td><%= Request.ServerVariables["UNENCODED_URL"] %></td>
            </tr>
            <tr>
                <td>Final URL: </td>
                <td><%= Request.ServerVariables["SCRIPT_NAME"] + "?" + Request.ServerVariables["QUERY_STRING"] %></td>
            </tr>
        </table>
        <h2>Outbound URL Rewriting</h2>
            <a href="<%= Request.ServerVariables["SCRIPT_NAME"] + "?" + Request.ServerVariables["QUERY_STRING"] %>">Here</a> is the link to this article.
    </body>
    </html>
    
  3. Abra un explorador web y solicite la siguiente dirección URL para asegurarse de que la página se representa correctamente:

    http://localhost/article.aspx
    

Adición de una regla de reescritura de entrada

El siguiente paso consiste en agregar una regla que reescriba las direcciones URL que tienen el siguiente formato:

http://localhost/article/342/some-article-title

Estas direcciones URL se reescribirán para tener un formato similar al siguiente:

http://localhost/article.aspx?id=342&title=some-article-title

Para agregar la regla de reescritura de entrada:

  1. Abra el archivo web.config ubicado en la siguiente ubicación:

    %SystemDrive%\inetpub\wwwroot\
    
  2. En el elemento /configuration/system.webServer, agregue lo siguiente y guarde el archivo:

    <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}&amp;title={R:2}" />
        </rule>
      </rules>
    </rewrite>
    

Para obtener más información sobre cómo crear reglas de reescritura de entrada, consulte Creación de reglas de reescritura para el Módulo URL Rewrite.

Prueba de la regla de reescritura de entrada

Ahora, puede probar que la regla de reescritura de entrada funciona según lo diseñado.

Para probar la regla de reescritura de entrada:

Abra un explorador web y solicite la siguiente dirección URL:

http://localhost/article/342/some-article-title

Si la regla de reescritura funciona correctamente, obtendrá un formulario de respuesta del servidor con el siguiente aspecto:

Screenshot of the Final U R L after hovering over the link in the U R L Rewrite Module Test Page using a web browser.

Puede ver que debido a la regla de entrada es posible acceder a esta página web mediante una estructura de dirección URL sencilla y fácil de usar. Sin embargo, si un usuario hace clic en el hipervínculo dentro de la página HTML, el explorador web usará la dirección URL con parámetros de cadena de consulta. Esto no es preferible por varias razones:

  1. Los visitantes del sitio web verán la estructura interna de las direcciones URL que desea ocultar mediante una regla de reescritura de direcciones URL.
  2. Se podrá acceder a la misma página mediante varias direcciones URL, lo que no es ideal para la optimización del motor de búsqueda.

La manera más sencilla de corregir esto es modificar la página HTML para que use la estructura de vínculos simple. Sin embargo, en muchos casos esto no es posible. Por ejemplo, si ya tiene una aplicación web heredada compleja o una aplicación web en la que no puede realizar modificaciones, la tarea de corregir todos los vínculos de dirección URL de la aplicación puede ser muy lenta o no ser factible en absoluto.

Aquí es donde la reescritura de direcciones URL de salida puede ayudar. La reescritura de direcciones URL de salida puede corregir los vínculos sobre la marcha en la respuesta generada por una aplicación.

Creación de una regla de reescritura de salida

Ahora, creará una regla de reescritura de salida que cambie las direcciones URL en las respuestas HTML. La regla cambiará las direcciones URL que tengan el formato siguiente:

http://localhost/article.aspx?id=342&title=some-article-title

Estas direcciones URL se reescribirán como las siguientes:

http://localhost/article/342/some-article-title

Creará una regla de salida mediante la interfaz de usuario de reescritura de direcciones URL en el Administrador de IIS.

Para crear la regla de salida:

  1. Abra el Administrador de IIS.
  2. Seleccione "Sitio web predeterminado".
  3. En la vista de características, seleccione "Reescritura de direcciones URL".
    Screenshot of U R L Rewrite selected in the Default Web Site Home pane.
  4. En el panel Acciones del lado derecho, haga clic en "Agregar reglas...". En el cuadro de diálogo "Agregar reglas", seleccione la "Regla en blanco" en la categoría "Reglas de salida" y haga clic en Aceptar.
    Screenshot of selecting a Blank rule template under Outbound rules in the Add Rules dialog.

Ahora, debe definir la regla de salida real. En la versión 2.0 del Módulo URL Rewrite, especifique la siguiente información para definir una regla de reescritura de salida:

  • Nombre de la regla.
  • Condición previa opcional que controla si esta regla se debe aplicar a una respuesta.
  • Patrón que se va a usar para hacer coincidir la cadena de la respuesta.
  • Conjunto opcional de condiciones.
  • Acción que se va a realizar si un patrón coincide y todas las comprobaciones de condición se han realizado correctamente.

Asignar un nombre a la regla

En el cuadro de texto "Nombre", escriba un nombre que identifique de forma única la regla, por ejemplo: "Reescritura para limpiar la dirección URL".

Definición de una condición previa

Se usa una condición previa para evaluar si la evaluación de las reglas de salida debe realizarse en una respuesta. Por ejemplo, si es una regla que modifica el contenido HTML, solo se deben evaluar en esta regla las respuestas HTTP con el encabezado content-type establecido en "text/html". La evaluación de reglas de salida y la reescritura de contenido es una operación intensiva de CPU que puede afectar negativamente al rendimiento de una aplicación web. Por lo tanto, use condiciones previas para restringir los casos en los que se aplican las reglas de salida.

Dado que la regla que está creando solo debe aplicarse en las respuestas HTML, definirá una condición previa que compruebe si el content-type del encabezado de respuesta HTTP es igual a "text/html".

Para definir una condición previa:

  1. En la lista Condiciones previas, seleccione "<Crear nueva condición previa>".

  2. Esto le llevará al cuadro de diálogo del editor de condiciones previas, donde deberá definir la condición previa. Especifique la configuración de la condición previa como se indica a continuación:

    • Nombre: "IsHTML"

    • Uso de: "Expresiones regulares"

    • Haga clic en "Agregar" para abrir el cuadro de diálogo "Agregar condición". En este cuadro de diálogo, especifique:

      • Entrada de condición: "{RESPONSE_CONTENT_TYPE}"

      • Comprobar si la cadena de entrada: "Coincide con el patrón"

      • Patrón: "^text/html"

        Screenshot of adding a new pre-condition with the specified settings.

  3. Haga clic en Aceptar para guardar la condición previa y volver a la página "Editar regla".

Definición de un ámbito de coincidencia

La regla de reescritura de salida puede funcionar en el contenido de un encabezado HTTP o en el contenido del cuerpo de la respuesta. Esta regla debe reemplazar los vínculos en el contenido de la respuesta, por lo que en la lista desplegable "Ámbito de coincidencia" elija "Respuesta".

Definición de un filtro de etiquetas

Los filtros de etiquetas se usan para limitar el ámbito de la coincidencia de patrones solo a determinados elementos HTML, en lugar de evaluar toda la respuesta con el patrón de la regla. La coincidencia de patrones es una operación muy intensiva de CPU y, si se evalúa una respuesta completa con un patrón, puede ralentizar significativamente el tiempo de respuesta de la aplicación web. Los filtros de etiquetas permiten especificar que la coincidencia de patrones solo se debe aplicar dentro del contenido de determinadas etiquetas HTML, lo que reduce significativamente la cantidad de datos que se deben evaluar con respecto al patrón de expresión regular.

Para definir un filtro de etiquetas, expanda la lista desplegable "Coincide con el contenido dentro de:" y, a continuación, seleccione y active la casilla "A (atributo href)".

Esto establece la regla para aplicar el patrón solo al valor del atributo href del hipervínculo, como en el ejemplo siguiente:

<a href="this string will be used for pattern matching">Some link</a>

Definición de un patrón

En el cuadro de texto "Patrón", escriba la cadena siguiente:

^/article\.aspx\?id=([0-9]+)(?:&|&amp;)title=([_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.aspx?".
  • Contiene un primer parámetro de cadena de consulta que tiene un valor numérico.
  • Contiene un segundo parámetro de cadena de consulta que tiene un valor alfanumérico.

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. Además, en la mayoría de los casos, el símbolo "&" está codificado en HTML en la respuesta, por lo que el patrón de expresión regular debe tenerlo en cuenta.

Definición de una acción

Elija el tipo de acción "Reescribir" en el cuadro de grupo "Acción". En el cuadro de texto "Valor", escriba la cadena siguiente:

/article/{R:1}/{R:2}

Esta cadena especifica el nuevo valor que se debe reescribir en la dirección del vínculo. Observe que, para los valores de los parámetros de cadena de consulta, la expresión usa {R:1} y {R:2}, que son referencias inversas a los grupos de capturas definidos en el patrón de regla mediante paréntesis.

Deje los valores predeterminados para todas las demás configuraciones. La página de propiedades "Editar regla" será similar a la página siguiente:

Screenshot before applying the new Outbound Rewrite Rule with the Is H T M L Pre-condition

Para guardar la regla, haga clic en la acción "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 aplicationHost.config o en los archivos web.config. Para comprobar la configuración de la regla que acaba de crear, abra un archivo web.config ubicado en

%SystemDrive%\inetput\wwwroot\

En este archivo, verá la sección <rewrite>, que contiene todas las definiciones de reglas, como en el ejemplo siguiente:

<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}&amp;title={R:2}" />
  </rule>
 </rules>
 <outboundRules>
  <rule name="Rewrite to clean URL" preCondition="IsHTML">
   <match filterByTags="A" pattern="^/article\.aspx\?id=([0-9]+)(?:&amp;|&amp;amp;)title=([_0-9a-z-]+)$" />
   <action type="Rewrite" value="/article/{R:1}/{R:2}" />
  </rule>
  <preConditions>
   <preCondition name="IsHTML">
    <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
   </preCondition>
  </preConditions>
 </outboundRules>
</rewrite>

Prueba de la regla

Ahora, puede probar que la regla reescribe correctamente las direcciones URL. Abra un explorador web y solicite la siguiente dirección URL:

http://localhost/article/342/some-article-title

Debería ver que la regla de reescritura de salida ha cambiado el vínculo dentro de la respuesta HTML:

Screenshot of the new U R L after hovering over the link in the U R L Rewrite Module Test Page using a web browser.

Ahora, si un visitante del sitio hace clic en este vínculo, se usará el formato de dirección URL limpia y no se mostrará una representación de dirección URL interna usada por esta página.

Resumen

En este tutorial, ha aprendido a configurar reglas de reescritura de salida en la versión 2.0 del Módulo URL Rewrite mediante el Administrador de IIS o mediante la edición manual del archivo web.config. Las reglas que se crearon en este tutorial han mostrado algunas de las características importantes de la versión 2.0 del Módulo URL Rewrite, como la reescritura de salida, las condiciones previas y los filtros de etiquetas.