Compartir a través de


Uso de asignaciones de reescritura en el Módulo URL Rewrite

Por Ruslan Yakushev

Este tutorial le presentará el concepto de asignaciones de reescritura en el Módulo URL Rewrite y le guiará en la creación de reglas de reescritura que usan asignaciones de reescritura. En este tutorial, creará dos asignaciones de reescritura: una asignación de reescritura la usará la regla que realiza la reescritura de direcciones URL y la otra asignación de reescritura la usará la regla que realiza los redireccionamientos a otro dominio.

Fondo

Una asignación de reescritura es una colección arbitraria de pares nombre-valor que se pueden usar dentro de las reglas de reescritura para generar una dirección URL de sustitución durante la reescritura. Las asignaciones de reescritura son especialmente útiles cuando tiene un gran conjunto de reglas de reescritura y todas estas reglas usan cadenas estáticas (es decir, cuando no se usa ninguna coincidencia de patrones). En esos casos, en lugar de definir un gran conjunto de reglas de reescritura simples, puede colocar todas las asignaciones en la asignación de reescritura (como claves y valores) entre la dirección URL de entrada y la de sustitución. A continuación, para buscar la dirección URL de sustitución en función de la dirección URL de entrada, tendrá una regla de reescritura que haga referencia a esta asignación de reescritura.

Requisitos previos

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

  1. IIS 7.0 o posterior con el servicio de rol ASP.NET habilitado
  2. Versión Go Live de URL Rewrite instalada

Configuración de una página web de prueba

Para demostrar la funcionalidad de asignación de reescritura, usaremos una página de prueba sencilla de ASP:NET. En esta página, se leen las variables de servidor web y se generan sus valores en el explorador.

Copie el siguiente código de ASP.NET y colóquelo en la carpeta %SystemDrive%\inetpub\wwwroot\ en un archivo llamado 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 haya representado correctamente en un explorador.

Screenshot that shows the test page rendered in a browser.

Creación de una asignación para reescribir

En primer lugar, crearemos una regla de reescritura y una asignación de reescritura que se usarán para realizar la reescritura de direcciones URL en función de un conjunto de asignaciones estáticas entre direcciones URL originales y direcciones URL reescritas. Para crear una asignación de reescritura, siga estos pasos:

  1. Vaya al Administrador de IIS.

  2. Seleccione "Sitio web predeterminado".

  3. En la vista de características, haga clic en "Reescritura de direcciones URL".
    Screenshot that shows U R L Rewrite in Features View.

  4. En el panel "Acciones" del lado derecho, haga clic en "Ver asignaciones de reescritura...":
    Screenshot that shows View rewrite maps...

  5. En el panel "Acciones" del sitio de la derecha, haga clic en "Agregar asignación de reescritura..." y, a continuación, escriba el nombre de la asignación de reescritura como "StaticRewrites":
    Screenshot that shows the Rewrite map name box.

  6. En la página de la asignación de reescritura recién creada, en el panel "Acciones" del lado derecho, haga clic en "Agregar entrada de asignación..." y luego escriba "/article" y "/article.aspx?id=1&title=some-title" para los cuadros de texto "Valor original:" y "Nuevo valor:" respectivamente. El valor original especifica la ruta de acceso URL desde la que queremos reescribir; el nuevo valor especifica en qué ruta de acceso URL queremos reescribir.
    Screenshot that shows the Original value and New value boxes.

  7. Repita el paso 6 para agregar las siguientes asignaciones al mapa de reescritura:

    Valor original: Nuevo valor:
    /some-title /article.aspx?id=1&title=some-title
    /post/some-title.html /article.aspx?id=1&title=some-title

Ahora, abra el archivo web.config correspondiente al sitio web (si usa el sitio web predeterminado, el archivo web.config se puede encontrar en %SystemDrive%\inetpub\wwwroot). Debería ver la sección siguiente:

<rewrite>
    <rewriteMaps>
        <rewriteMap name="StaticRewrites" defaultValue="">
            <add key="/article1" value="/article.aspx?id=1&amp;title=some-title" />
            <add key="/some-title" value="/article.aspx?id=1&amp;title=some-title" />
            <add key="/post/some-title.html" value="/article.aspx?id=1&amp;title=some-title" />
        </rewriteMap>
    </rewriteMaps>
</rewrite>

Esta asignación de reescritura, llamada "StaticRewrites", se usará para reescribir las direcciones URL entrantes (definidas como claves en la asignación de reescritura) a sus representaciones internas (definidas como valores). El atributo defaultValue especifica qué valor se va a usar si no se ha definido una dirección URL entrante en la asignación. En este caso, se devolverá una cadena vacía.

Observe que no hay ningún patrón común obvio en las claves y su relación con los valores. Esto significa que no es posible usar expresiones regulares ni caracteres comodín para definir la lógica de transformación de direcciones URL. Además, esto significa que si no hubiéramos utilizado asignaciones de reescritura habríamos tenido que crear tres reglas de reescritura. Con las asignaciones de reescritura podemos crear solo una regla de reescritura. En la sección siguiente, se explica cómo crear una regla de reescritura que use esta asignación de reescritura.

Referencia a una asignación de reescritura desde una regla de reescritura

Para crear una regla de reescritura que use las asignaciones de reescritura, copie y pegue el código XML siguiente en la sección <rewrite> del archivo web.config correspondiente al sitio web:

<rules>
    <rule name="Rewrite Rule">
        <match url=".*" />
        <conditions>
            <add input="{StaticRewrites:{REQUEST_URI}}" pattern="(.+)" />
        </conditions>
        <action type="Rewrite" url="{C:1}" />
    </rule>
</rules>

Echemos un vistazo a cada elemento de la regla para comprender lo que hace:
<match url=".*" />: este elemento indica al Módulo URL Rewrite que busque la coincidencia de cualquier dirección URL entrante (mediante el carácter especial de expresión regular ".")

<add input="{StaticRewrites:{REQUEST\_URI}}" pattern="(.+)">: esta condición comprueba si el valor devuelto de la asignación de reescritura StaticRewrites no es una cadena vacía. Para realizar esta comprobación, se pasa como parámetro el valor de la variable de servidor REQUEST_URI a la asignación de reescritura. Si la asignación de reescritura contiene una entrada con clave, que sea la misma que REQUEST_URI, se devolverá el valor correspondiente a esa clave. El patrón de expresión regular coincidirá solo con cadenas no vacías, por lo que si se devolvió una cadena vacía desde la asignación, la condición se evaluará como false, por lo que no se realizará ninguna reescritura. Si se devolvió una cadena no vacía, esa cadena se capturará en una referencia inversa, debido al paréntesis usado en el patrón.

<action type="Rewrite" url="{C:1}" />: este elemento especifica que el Módulo URL Rewrite debe reescribir la cadena de dirección URL actual con la nueva extraída de la asignación de reescritura. Observe que el atributo url hace referencia a la referencia inversa de la condición {C:1}, que se ha establecido cuando hay una coincidencia en el patrón de la condición.

Prueba de la regla para reescribir

Para probar la regla de reescritura que usa la asignación "StaticRewrites", abra el explorador web y solicite cualquiera de las siguientes direcciones URL:

http://localhost/article1
http://localhost/some-title
http://localhost/post/some-title.html

Cualquiera de las direcciones URL anteriores debe hacer que la dirección URL se reescriba de acuerdo con las asignaciones definidas en el mapa de reescritura. Los resultados deben tener un aspecto similar a la página siguiente:

Screenshot that shows the results of the test.

Uso de asignaciones de reescritura para el redireccionamiento

Ahora, crearemos otra asignación de reescritura que se usará para definir asignaciones estáticas entre direcciones URL de origen y direcciones URL de redireccionamiento. Para crear un mapa de reescritura, siga los mismos pasos que se describen en la sección "Creación de una asignación para reescribir", pero asigne el nombre "StaticRedirects" a la asignación de reescritura y use los siguientes valores para las entradas de la asignación:

Valor original: Nuevo valor:
/old-article.aspx?id=1 /article.aspx?id=1
/posts/default.aspx?id=1 /article.aspx?id=1
/old-title.html /article.aspx?id=1

El archivo web.config del sitio web ahora debe contener estas dos asignaciones de reescritura:

<rewriteMaps>
    <rewriteMap name="StaticRewrites">
        <add key="/article1" value="/article.aspx?id=1&amp;title=some-title" />
        <add key="/some-title" value="/article.aspx?id=1&amp;title=some-title" />
        <add key="/post/some-title.html" value="/article.aspx?id=1&amp;title=some-title" />
    </rewriteMap>
    <rewriteMap name="StaticRedirects">
        <add key="/old-article.aspx?id=1" value="/article.aspx?id=1" />
        <add key="/posts/default.aspx?id=1" value="/article.aspx?id=1" />
        <add key="/old-title.html" value="/article.aspx?id=1" />
    </rewriteMap>
</rewriteMaps>

Para crear una regla que use la asignación de reescritura StaticRedirects, copie y pegue la siguiente definición de regla en el archivo web.config del sitio web:

<rules>
    <rule name="Redirect Rule" stopProcessing="true">
        <match url=".*" />
        <conditions>
            <add input="{StaticRedirects:{REQUEST_URI}}" pattern="(.+)" />
        </conditions>
        <action type="Redirect" url="http://localhost{C:1}" appendQueryString="False" redirectType="Permanent" />
    </rule>
</rules>

De nuevo, vamos a repasar cada elemento de la regla para comprender lo que hace:
<match url=".*" />: este elemento indica al Módulo URL Rewrite que busque la coincidencia de cualquier dirección URL entrante (mediante el carácter especial de expresión regular ".")

<add input="{StaticRedirects:{REQUEST\_URI}}" pattern="(.+)">: esta condición comprueba si es el valor devuelto de la asignación de reescritura StaticRedirects no es una cadena vacía. Para realizar esta comprobación, se pasa como parámetro el valor de la variable de servidor REQUEST_URI a la asignación de reescritura. Si la asignación de reescritura contiene una entrada con clave, que sea la misma que REQUEST_URI, se devolverá el valor correspondiente a esa clave. El patrón de expresión regular coincidirá solo con cadenas no vacías, por lo que si se devolvió una cadena vacía desde la asignación, la condición se evaluará como false, por lo que no se realizará ninguna reescritura. Si se devolvió una cadena no vacía, esa cadena se capturará en una referencia inversa, debido al paréntesis usado en el patrón.

<action type="Redirect" url="http://localhost{C:1}" appendQueryString="False" redirectType="Permanent" />: este elemento especifica que el Módulo URL Rewrite debe redirigir el cliente web a una nueva dirección URL que se construye mediante la concatenación del nuevo nombre de dominio (en este caso, es el mismo dominio para simplificar) y la ruta de acceso de la dirección URL de redireccionamiento devuelta por la asignación StaticRedirects.

Prueba de la regla para el redireccionamiento

Para probar la regla de reescritura que usa la asignación "StaticRedirects", abra el explorador web y solicite cualquiera de las siguientes direcciones URL:

http://localhost/old-article
http://localhost/posts/default.aspx?id=1
http://localhost/old-title.html

Cualquiera de las direcciones URL anteriores debe hacer que el explorador se redirija a http://localhost/article.aspx?id=1.

Uso de asignaciones de reescritura para los parámetros de la cadena de consulta

El uso de las asignaciones de reescritura no se limita a los ejemplos mencionados anteriormente. Una asignación de reescritura es una colección genérica de pares clave-valor que se pueden usar en cualquier lugar de la regla de reescritura. Para ilustrar esto, vamos a crear una asignación de reescritura que se puede usar para la manipulación de los parámetros de la cadena de consulta.

Cree una tercera asignación de reescritura siguiendo los mismos pasos que se describen en la sección "Creación de una asignación para reescribir". Asigne el nombre "IDtoTitleMap" a la asignación de reescritura y use los siguientes valores para las entradas de la asignación:

Valor original: Nuevo valor:
1 some-title-1
2 some-title-2
3 some-title-3

El archivo web.config del sitio web ahora debe contener estas dos asignaciones de reescritura:

<rewriteMaps>
    <rewriteMap name="StaticRewrites">
        <add key="/article1" value="/article.aspx?id=1&amp;title=some-title" />
        <add key="/some-title" value="/article.aspx?id=1&amp;title=some-title" />
        <add key="/post/some-title.html" value="/article.aspx?id=1&amp;title=some-title" />
    </rewriteMap>
    <rewriteMap name="StaticRedirects">
        <add key="/old-article.aspx?id=1" value="/article.aspx?id=1" />
        <add key="/posts/default.aspx?id=1" value="/article.aspx?id=1" />
        <add key="/old-title.html" value="/article.aspx?id=1" />
    </rewriteMap>
    <rewriteMap name="IDtoTitleMap">
        <add key="1" value="some-title-1" />
        <add key="2" value="some-title-2" />
        <add key="3" value="some-title-3" />
    </rewriteMap>
</rewriteMaps>

Para crear una regla que use la asignación de reescritura IDtoTitleMap, copie y pegue la siguiente definición de regla en el archivo web.config del sitio web:

<rules>
    <rule name="Query String Rule" stopProcessing="true">
        <match url="^article\.aspx$" />
        <conditions>
            <add input="{QUERY_STRING}" pattern="(?:^|&)id=([0-9]+)(?:&|$)" />
            <add input="{IDtoTitleMap:{C:1}}" pattern="(.+)" />
        </conditions>
        <action type="Redirect" url="article.aspx?title={C:1}" appendQueryString="False" 
                                                            redirectType="Permanent" />
    </rule>
</rules>

Echemos un vistazo a cada elemento de la regla para comprender lo que hace:
<match url="^article\.aspx$" />: este elemento indica al Módulo URL Rewrite que ejecute la regla cuando se solicite el archivo article.aspx.

<add input="{QUERY\_STRING}" pattern="(?:^|&amp;)id=([0-9]+)(?:&amp;|$)" />: esta condición comprueba si la cadena de consulta contiene un parámetro idque tenga un valor numérico. El valor real se captura en una referencia inversa de condición. Tenga en cuenta que este patrón funcionará incluso si hay otros parámetros en la cadena de consulta.

<add input="{IDtoTitleMap:{C:1}}" pattern="(.+)" />: esta condición comprueba si es el valor devuelto de la asignación de reescritura IDtoTitleMap no es una cadena vacía. La condición usa la referencia inversa del patrón de condición anterior como entrada para la asignación de reescritura.

<action type="Redirect" url="article.aspx?title={C:1}" appendQueryString="False" redirectType="Permanent" />: este elemento especifica que el Módulo URL Rewrite debe redirigir el cliente web de nuevo al archivo article.aspx, pero con otro parámetro de cadena de consulta title, que tiene un valor que se ha buscado en la asignación de reescritura.

Prueba de la regla para la cadena de consulta

Para probar la regla de reescritura que usa la asignación "IDtoTitleMap", abra el explorador web y solicite cualquiera de las siguientes direcciones URL:

http://localhost/article.aspx?id=1. Esto se redirigirá a http://localhost/article.aspx?title=some-title-1. http://localhost/article.aspx?someparam=somevalue&id=2. Esto se redirigirá a http://localhost/article.aspx?title=some-title-2.

Resumen

En este tutorial, ha aprendido a usar asignaciones de reescritura para definir asignaciones de direcciones URL para reglas de reescritura y redirección. También ha aprendido a usar asignaciones de reescritura para manipular los parámetros de la cadena de consulta.

Las asignaciones de reescritura permiten reducir el número de reglas de reescritura cuando las direcciones URL de reescritura y redireccionamiento son estáticas y la lógica de reescritura no se puede expresar mediante ninguna técnica de coincidencia de patrones.