Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este tutorial se explican los distintos tipos de reglas compatibles con el módulo de reescritura de direcciones URL y se le guiará a través de cómo configurar reglas de reescritura globales y distribuidas.
Antecedentes
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 applicationHost.config archivo y no se pueden invalidar ni deshabilitar en niveles de configuración inferiores, como el sitio o el directorio virtual. Las reglas globales siempre operan en la ruta URL absoluta (es decir, el URI solicitado sin el nombre del servidor). Por ejemplo, si se realizó una solicitud a http://localhost/directory1/directory2/index.html, el módulo de reescritura de direcciones URL pasará "directory1/directory2/index.html" como entrada a una regla global.
Las reglas de reescritura distribuida 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 archivo) mediante web.config archivos. Las reglas locales siempre funcionan en direcciones URL relativas a la ubicación del archivo Web.config donde se definen. Por ejemplo, si se realizó una solicitud a http://localhost/directory1/directory2/index.html y se definió una regla de reescritura en Web.config archivo ubicado en directory1, el módulo de reescritura de direcciones URL pasará "directory2/index.html" como entrada a esa regla.
El conjunto de reglas global siempre se evalúa primero y después de ese conjunto de reglas distribuido se evaluará mediante una cadena de dirección URL generada por el conjunto de reglas global.
Prerrequisitos
Este tutorial requiere los siguientes requisitos previos:
- IIS 7.0 o posterior con ASP.NET servicio de rol habilitado
- Versión Go Live de reescritura de URL instalada
Configuración de un escenario de tutorial
Para demostrar cómo usar reglas globales y locales, implementaremos un escenario común de asignación de subdominios a directorios. Esto nos permitirá usar subdominios para acceder al contenido en diferentes directorios de nuestro sitio. Por ejemplo, los usuarios podrán navegar a http://blog.mysite.com en lugar de http://mysite.com/blog, o a http://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
%SystemDrive%\inetpub\wwwroot\la carpeta.Copie el código asp.net siguiente y colóquelo en la
%SystemDrive%\inetpub\wwwroot\blogcarpeta 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 asp.net siguiente y colóquelo en la
%SystemDrive%\inetpub\wwwroot\forumcarpeta de 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 agregue las dos líneas siguientes en el de él:127.0.0.1 forum_localhost 127.0.0.1 blog_localhostDespués de agregar estas líneas, abra un navegador web y vaya a http://blog_localhost/blog/article.aspx y a http://forum_localhost/forum/forum.aspx, y verifique que las páginas se renderizaron correctamente en el navegador.
Creación de una regla de reescritura global
En primer lugar, crearemos una regla de reescritura global que vuelva a escribir la dirección URL en función del encabezado del host. Por ejemplo, si se realizó una solicitud a http://blog_localhost/article.aspx, la regla cambiará la ruta de URL a "/blog/article.aspx".
Para crear una regla global mediante la interfaz de usuario de reescritura de direcciones URL 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 de reescritura de direcciones URL"
- 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 debemos definir la regla de reescritura real. En la regla de reescritura del módulo de reescritura url se define especificando cuatro fragmentos esenciales de información:
- Nombre de la regla
- Patrón que se va a usar para buscar coincidencias con la cadena de dirección URL
- Conjunto opcional de condiciones
- Acción que se debe realizar si el patrón coincide y todas las comprobaciones de condiciones se realizaron correctamente
Asignar un nombre a una regla
En el cuadro de texto "Name" (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 "Pattern", escriba la cadena siguiente:
(.*)
Esta cadena es una expresión regular que especifica que el patrón coincidirá con cualquier cadena de dirección 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 "Agregar..." botón para abrir el cuadro de diálogo para definir condiciones.
En "Entrada de condición:" escriba esta cadena: "{HTTP_HOST}". Esto configura el módulo de reescritura de direcciones URL para usar el valor del encabezado del 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 "Pattern" (Patrón), escriba "^([^_]+)_[^_]+". Esta expresión regular se usará para coincidir con los dominios que hemos creado (blog_localhost y forum_localhost) y capturará la parte de la cadena antes del símbolo "_" en una referencia inversa. Por ejemplo, para la cadena "blog_localhost", mantendrá el "blog" en la referencia inversa.
Una vez especificadas 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
Dado que la regla que estamos creando se supone que reescriba la dirección URL, elija el tipo de acción "Reescritura" dentro del cuadro de grupo "Acción". En el cuadro de texto "Rewrite URL:" escriba la siguiente cadena:
{C:1}/{R:1}
Esta cadena especifica en qué se debe volver a escribir la dirección URL de entrada. La referencia inversa a la condición {C:1} se usa como nombre de la carpeta y, a continuación, se conserva lo que se capturó en el patrón de regla mediante la referencia inversa a la regla {R:1}.
Deje los valores predeterminados para todas las demás configuraciones. La interfaz de usuario "Editar regla" debe tener el siguiente aspecto:
Guarde la regla haciendo clic en la acción "Aplicar" en el lado derecho.
Para comprender cómo se aplicará esta regla, veamos los pasos que realiza el módulo de reescritura de direcciones URL cuando el cliente HTTP solicita esta dirección URL:
http://blog_localhost/article.aspx?id=323:
- El módulo de reescritura de direcciones URL 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 de 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 dirección URL:
http://blog_localhost/article.aspx?id=123
Debería ver que el módulo de reescritura de direcciones URL ha cambiado la dirección URL y ha abierto una página de Article.aspx en el directorio "blog". Los cambios realizados por el módulo de reescritura de direcciones URL se basaron en la información extraída del encabezado del 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 acabamos de crear se usó para asignar la solicitud a una carpeta en función de la información extraída del encabezado host. Ahora crearemos reglas distribuidas que nos permitirán tener las direcciones URL sin parámetros de cadena de consulta. Las reglas distribuidas tomarán como entrada la dirección URL, que ya se modificó mediante regla global y realizarán modificaciones adicionales. En particular:
- Una regla de reescritura en la carpeta "blog" reescribirá la ruta de acceso URL de "article/234/some-title" a "article.aspx?id=234&title=some-title"
- Una regla de reescritura en la carpeta "forum" reescribirá la ruta de dirección URL de "topic/123/some-topic-title" a "forum.aspx?topic=some-topic-title&id=123"
Las reglas locales se pueden crear mediante el Administrador de IIS o editando archivos web.config. Para fines de demostración, crearemos las reglas editando manualmente web.config archivos.
Para crear reglas de reescritura distribuidas:
Cree un archivo web.config vacío en
%SystemDrive%\inetpub\wwwroot\**blog**la carpeta . Ábralo en el editor de texto y pegue el código XML siguiente en él:<?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
%SystemDrive%\inetpub\wwwroot\**forum**la carpeta . Ábralo en el editor de texto y pegue el código XML siguiente en él:<?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 juntas, 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 ha cambiado por primera vez mediante una regla global y, a continuación, se ha modificado además mediante una regla distribuida.
Del mismo modo, si solicita http://forum_localhost/topic/123/some-topic-title, debería ver que el módulo de reescritura de dirección URL 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 la regla global y, a continuación, ha usado reglas distribuidas para habilitar las direcciones URL fáciles de usar para las páginas web de esas carpetas.