Uso de reglas de reescritura global y distribuida
En este tutorial se explican los distintos tipos de reglas compatibles con el módulo URL Rewrite y se le guiará por la configuración de reglas de reescritura globales y distribuidas.
Fondo
Las reglas de reescritura global se usan para definir la lógica de reescritura de direcciones URL en todo el servidor. Estas reglas se definen en el archivo applicationHost.config y no se pueden invalidar ni deshabilitar en niveles de configuración inferiores, como los de sitio o directorio virtual. Las reglas globales siempre funcionan en la ruta de acceso de dirección URL absoluta (es decir, el URI solicitado sin el nombre del servidor). Por ejemplo, si se ha realizado una solicitud a http://localhost/directory1/directory2/index.html
, el módulo URL Rewrite pasará "directory1/directory2/index.html" como entrada a una regla global.
Las reglas de reescritura distribuidas se usan para definir la lógica de reescritura de direcciones URL específica de un ámbito de configuración determinado. Las reglas distribuidas se pueden definir en cualquier nivel de configuración (excepto el de archivo) mediante archivos web.config. Las reglas locales siempre funcionan en direcciones URL relativas a la ubicación del archivo Web.config donde se definen. Por ejemplo, si se ha realizado una solicitud a http://localhost/directory1/directory2/index.html
y se ha definido una regla de reescritura en el archivo Web.config ubicado en directory1, el módulo URL Rewrite pasará "directory2/index.html" como entrada a esa regla.
El conjunto de reglas globales siempre se evalúa primero y, después, se evaluará el conjunto de reglas distribuidas mediante una cadena de dirección URL generada por el conjunto de reglas globales.
Requisitos previos
Para este tutorial se necesitan los siguientes requisitos previos:
- IIS 7.0 o posterior con el servicio de rol ASP.NET habilitado
- Versión Go Live de URL Rewrite instalada
Configuración de un escenario de tutorial
Para demostrar cómo usar reglas globales y locales, se implementará un escenario común de asignación de subdominios a directorios. Esto le permitirá usar subdominios para acceder al contenido en diferentes directorios del sitio. Por ejemplo, los usuarios podrán navegar a http://blog.mysite.com
en lugar de http://mysite.com/blog
, o ahttp://forum.mysite.com
en lugar de http://mysite.com/forum
.
Para configurar el escenario, siga estos pasos:
Cree dos carpetas denominadas "blog" y "foro" en la carpeta
%SystemDrive%\inetpub\wwwroot\
.Copie el código de ASP.NET siguiente y colóquelo en la carpeta
%SystemDrive%\inetpub\wwwroot\blog
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> <p>This page is located in blog subdomain.</p> <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>
Copie el código de ASP.NET siguiente y colóquelo en la carpeta
%SystemDrive%\inetpub\wwwroot\forum
en un archivo denominado forum.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> <p>This page is located in forum subdomain.</p> <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>
Abra el archivo denominado "hosts", que se encuentra en
%SystemDrive%\windows\system32\drivers\etc\
y agréguele las dos líneas siguientes:127.0.0.1 forum_localhost 127.0.0.1 blog_localhost
Después de agregar estas líneas, abra un explorador web y vaya a http://blog_localhost/blog/article.aspx y http://forum_localhost/forum/forum.aspx, y compruebe que las páginas se han representado correctamente en un explorador.
Creación de una regla de reescritura global
En primer lugar, se creará una regla de reescritura global que vuelve a escribir la dirección URL en función del encabezado host. Por ejemplo, si se ha realizado una solicitud para http://blog_localhost/article.aspx, la regla cambiará la ruta de acceso de la URL a "/blog/article.aspx".
Para crear una regla global mediante la interfaz de usuario de URL Rewrite en el Administrador de IIS, siga estos pasos:
- Vaya al Administrador de IIS.
- En la vista de árbol de navegación, seleccione el nodo de servidor.
- En la vista de características, haga clic en "Módulo URL Rewrite".
- En el panel "Acciones", 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, la regla de reescritura se define mediante la especificación de cuatro fragmentos esenciales de información:
- 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 debe realizar si el patrón coincide y 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: "Asignación de subdominios".
Definición de un patrón
En el cuadro de texto "Patrón", escriba la cadena siguiente:
(.*)
Esta cadena es una expresión regular que especifica que el patrón coincidirá con cualquier cadena de URL, incluida una cadena vacía, y capturará la cadena coincidente en una referencia inversa.
Definición de una condición
Haga clic en el botón "Agregar condiciones":
Haga clic en el botón "Agregar..." a fin de abrir el cuadro de diálogo para definir condiciones.
En "Entrada de condición:" escriba esta cadena: "{HTTP_HOST}". Esto configura el módulo URL Rewrite para usar el valor del encabezado host de solicitud http como entrada para la condición.
En el cuadro combinado desplegable, seleccione "Coincide con el patrón".
En el cuadro de texto "Patrón", escriba "^([^_]+)_[^_]+". Esta expresión regular se usará para comparar los dominios que ha creado (blog_localhost y forum_localhost), y capturará la parte de la cadena que aparece antes del símbolo "_" en una referencia inversa. Por ejemplo, para la cadena "blog_localhost", mantendrá "blog" en la referencia inversa.
Una vez que se especifiquen todas las propiedades, el cuadro de diálogo de condición debe tener el siguiente aspecto:
Haga clic en Aceptar para guardar la condición y volver a la interfaz de usuario "Agregar regla".
Definición de una acción
Como la regla que se va a crear debe reescribir la dirección URL, elija el tipo de acción "Reescribir" dentro del cuadro de grupo "Acción". En el cuadro de texto "URL Rewrite", escriba la cadena siguiente:
{C:1}/{R:1}
Esta cadena especifica en qué se debe volver a escribir la URL de entrada. La referencia inversa a la condición {C:1} se usa como nombre de la carpeta y, después, se conserva lo que se haya capturado en el patrón de regla mediante la referencia inversa a la regla {R:1}.
Deje los valores predeterminados restantes. La interfaz de usuario "Editar regla" debe ser similar a la página siguiente:
Para guardar la regla, haga clic en la acción "Aplicar" en el lado derecho.
Para comprender cómo se aplicará esta regla, se describirán los pasos que realiza el módulo URL Rewrite cuando el cliente HTTP solicita esta dirección URL:
http://blog_localhost/article.aspx?id=323
:
- El módulo URL Rewrite pasa "article.aspx?id=323" como dirección URL de entrada a la regla, lo compara correctamente con el patrón de regla y lo captura en una referencia inversa de regla {R:1}
- El valor del encabezado host ("blog_localhost") coincide correctamente con la expresión regular "^([^_]+)_[^_]+" y, como resultado, "blog" se captura en una referencia inversa de condición {C:1}
- De acuerdo con la cadena de sustitución {C:1}/{R:1}, la dirección URL se vuelve a escribir en "blog/article.aspx?id=323".
Prueba de la regla
Para probar que la regla vuelve a escribir correctamente las direcciones URL, abra el explorador de Internet y solicite la siguiente URL:
http://blog_localhost/article.aspx?id=123
Debería ver que el módulo URL Rewrite ha cambiado la dirección URL y ha abierto una página Article.aspx en el directorio "blog". Los cambios realizados por el módulo URL Rewrite se han basado en la información extraída del encabezado host.
Del mismo modo, cuando solicite http://forum_localhost/forum.aspx?id=345
, la dirección URL se volverá a escribir en /forum/forum.aspx?id=345.
Creación de reglas distribuidas
La regla global que acaba de crear se ha usado para asignar la solicitud a una carpeta en función de la información extraída del encabezado host. Ahora se crearán reglas distribuidas que permitirán tener direcciones URL sin parámetros de cadena de consulta. Las reglas distribuidas tomarán como entrada la dirección URL, que ya se ha modificado mediante la regla global, y realizarán cambios adicionales. En concreto:
- Una regla de reescritura en la carpeta "blog" reescribirá la ruta de acceso de la URL de "article/234/some-title" en "article.aspx?id=234&title=some-title"
- Una regla de reescritura en la carpeta "forum" reescribirá la ruta de acceso de la URL de "topic/123/some-topic-title" en "forum.aspx?topic=some-topic-title&id=123"
Las reglas locales se pueden crear mediante el Administrador de IIS o la edición de archivos web.config. Con fines de demostración, las reglas se crearán mediante la edición manual de los archivos web.config.
Para crear reglas de reescritura distribuidas:
Cree un archivo web.config vacío en la carpeta
%SystemDrive%\inetpub\wwwroot\**blog**
. Ábralo en el editor de texto y pegue en su interior el código XML siguiente:<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <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> </system.webServer> </configuration>
Cree un archivo web.config vacío en la carpeta
%SystemDrive%\inetpub\wwwroot\**forum**
. Ábralo en el editor de texto y pegue en su interior el código XML siguiente:<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="Rewrite to forum.aspx"> <match url="^topic/([0-9]+)/([_0-9a-z-]+)"/> <action type="Rewrite" url="forum.aspx?topic={R:2}&id={R:1}"/> </rule> </rules> </rewrite> </system.webServer> </configuration>
Prueba de reglas globales y distribuidas
Para probar que todas las reglas funcionan correctamente, abra un explorador web y realice una solicitud a http://blog_localhost/article/234/some-title
. La respuesta en el explorador debe indicar que la dirección URL se ha cambiado primero mediante una regla global y, después, se ha modificado mediante una regla distribuida.
Del mismo modo, si solicita http://forum_localhost/topic/123/some-topic-title
, debería ver que el módulo URL Rewrite cambia la cadena de dirección URL solicitada a "/forum/forum.aspx?topic=some-topic-title&id=123".
Resumen
En este tutorial ha implementado un escenario de asignación de subdominios mediante una regla global y, después, ha usado reglas distribuidas a fin de habilitar direcciones URL fáciles de usar para las páginas web de esas carpetas.