Compartir a través de


Proxy inverso con reescritura de URL v2 y enrutamiento de solicitudes de aplicación

de Ruslan Yakushev

Este tutorial le guiará con el uso del módulo de reescritura de direcciones URL y el enrutamiento de solicitud de aplicaciones (ARR) para implementar un servidor proxy inverso para varias aplicaciones de back-end.

Requisitos previos

Para ejecutar este tutorial, debe disponer de lo siguiente:

  1. IIS 7 o posterior con el servicio de rol ASP.NET habilitado
  2. Módulo de reescritura de direcciones URL instalado (se requiere la versión 2.0 si desea completar la parte sobre la reescritura de respuesta)
  3. Enrutamiento de solicitud de aplicaciones versión 1.0 o 2.0 instalada

Introducción

Mediante el módulo de reescritura de direcciones URL y el enrutamiento de solicitud de aplicaciones puede implementar configuraciones complejas y flexibles de equilibrio de carga y proxy inverso. Un escenario de proxy inverso muy común es poner a disposición a través de Internet varias aplicaciones web internas. Un servidor web accesible para Internet se usa como servidor proxy inverso que recibe solicitudes web y los reenvía a varias aplicaciones de intranet para su procesamiento: en la ilustración siguiente se muestra una configuración típica para un escenario de proxy inverso:

Diagram of a typical configuration for a reverse proxy scenario.

Suponiendo que el servidor de ARR tiene un nombre de dominio http://contoso.com, se puede acceder a cada aplicación web mediante estas direcciones URL:

  • http://contoso.com/webmail/
  • http://contoso.com/payroll/

Cuando se realiza una solicitud a http://contoso.com/webmail/default.aspx, ARR reenvía estas solicitudes a un servidor interno mediante la dirección URL http://webmail/default.aspx. Del mismo modo, las solicitudes a http://contoso.com/payroll/ se reenvían a http://payroll/default.aspx.

Además, si la aplicación interna inserta vínculos en su HTML de respuesta que se vinculan a otras partes de esas aplicaciones, esos vínculos se deben modificar antes de que se devuelva la respuesta al cliente. Por ejemplo, una página de http://webmail/default.aspx puede contener un vínculo similar al siguiente:

<a href="/default.aspx?id=1">link</a>

A continuación, el servidor de ARR debe cambiar este vínculo a lo siguiente:

<a href="/webmail/default.aspx?id=1">link</a>

Creación de sitios web de ejemplo

Por motivos de simplicidad, el escenario de proxy inverso con el que trabajará en este tutorial se implementará en un solo servidor, el "sitio web predeterminado" de IIS actuará como sitio de proxy inverso y aplicación de contenido hospedada en sitios web IIS independientes en el mismo servidor.

Para crear los sitios web de ejemplo:

  1. Cree dos carpetas denominadas "webmail" y "payroll" en la carpeta siguiente:

    %SystemDrive%\inetpub\ folder.
    
  2. Cree dos sitios web de IIS denominados "webmail" y "payroll" que apunten a las carpetas correspondientes en %SystemDrive%\inetpub\. Use puertos IP diferentes para cada sitio.
    Puede usar los comandos siguientes para crear los sitios:

    %windir%\System32\inetsrv\appcmd.exe add site /name:"webmail" /bindings:http/*:8081: /physicalPath:"%SystemDrive%\inetpub\webmail"
    
    %windir%\System32\inetsrv\appcmd.exe add site /name:"payroll" /bindings:http/*:8082: /physicalPath:"%SystemDrive%\inetpub\payroll"
    
  3. Cree un archivo denominado default.aspx en la carpeta siguiente:

    %SystemDrive%\inetpub\webmail
    
  4. Copie el siguiente marcado 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>Reverse Proxy Test - WebMail Application</title>
    </head>
    <body>
        <h1>Reverse Proxy Test Page - WebMail Application</h1>
        <p>Requested URL path is <%= Request.ServerVariables["SCRIPT_NAME"] %><p>
        <p><a href="<%= Request.ServerVariables["SCRIPT_NAME"] %>">Here</a> is the link to this page.</p>
    </body>
    </html>
    
  5. Cree un archivo denominado default.aspx en la carpeta siguiente:

    %SystemDrive%\inetpub\payroll
    
  6. Copie el siguiente marcado 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>Reverse Proxy Test - Payroll Application</title>
    </head>
    <body>
        <h1>Reverse Proxy Test Page - Payroll Application</h1>
        <p>Requested URL path is <%= Request.ServerVariables["SCRIPT_NAME"] %><p>
        <p><a href="<%= Request.ServerVariables["SCRIPT_NAME"] %>">Here</a> is the link to this page.</p>
    </body>
    </html>
    
  7. Para asegurarse de que el sitio funciona correctamente, abra un navegador web y solicite las siguientes direcciones URL:

    http://localhost:8081/default.aspx
    
    http://localhost:8082/default.aspx
    

Configuración de reglas para el proxy inverso

En esta sección del tutorial, configurará la funcionalidad de proxy inverso para trabajar con los sitios web de ejemplo que ha creado.

Habilitación de la funcionalidad del proxy inverso

La funcionalidad del proxy inverso está deshabilitada de forma predeterminada, por lo que debe comenzar por habilitarla.

  1. Abra el administrador de IIS.
  2. Seleccione un nodo de servidor en la vista de árbol en el lado izquierdo y haga clic en la característica "Enrutamiento de solicitud de aplicaciones":
    Screenshot of the I I S Manager. Different icons are shown. The Application Request Routing icon is highlighted.
  3. Marque la casilla "Habilitar proxy". Deje los valores predeterminados para todas las demás configuraciones de esta página:
    Screenshot of the Application Request Routing page. Enable proxy is highlighted and selected.

Creación de una regla para la aplicación de correo web

Creará dos reglas de reescritura:

  • Regla de reescritura que redirigirá mediante proxy cualquier solicitud a la aplicación de correo web de http://localhost:8081/ siempre que la ruta de acceso a la dirección URL solicitada comience por "webmail".
  • Regla de reescritura que redirigirá mediante proxy cualquier solicitud a la aplicación de nóminas de http://localhost:8082/ siempre que la ruta de acceso a la dirección URL solicitada comience por "payroll".

Para agregar las reglas de reescritura del proxy inverso:

  1. Abra el archivo web.config de 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="Reverse Proxy to webmail" stopProcessing="true">
                <match url="^webmail/(.*)" />
                <action type="Rewrite" url="http://localhost:8081/{R:1}" />
            </rule>
            <rule name="Reverse Proxy to payroll" stopProcessing="true">
                <match url="^payroll/(.*)" />
                <action type="Rewrite" url="http://localhost:8082/{R:1}" />
            </rule>
        </rules>
    </rewrite>
    

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

Prueba de la funcionalidad del proxy inverso

Ahora abra un explorador web y realice una solicitud a http://localhost/webmail/default.aspx. Debería ver la respuesta de la página de prueba del correo web. Además, realice una solicitud a http://localhost/payroll/default.aspx. Debería ver la respuesta de la página de prueba de nóminas.

Screenshot of the Reverse Proxy Test Page Web Mail Application. At the bottom the U R L h t t p colon slash local host slash default dot a s p x is highlighted.

Observe que, en ambos casos, el vínculo de la respuesta apunta a http://localhost/default.aspx. Si hace clic en este vínculo, se producirá la respuesta 404 (archivo no encontrado) del servidor. En la sección siguiente aprenderá a crear una regla de salida para corregir los vínculos que genera la respuesta HTML generada por la aplicación.

Configuración de reglas para la reescritura de respuesta

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

Definirá una regla de salida que reemplace todos los vínculos dentro del HTML de respuesta como se indica a continuación:

<a href="/default.aspx">...</a>

debe reemplazarse por:

<a href="/webmail/default.aspx">...</a>

(si la respuesta procede de la aplicación de correo web)

y

<a href="/payroll/default.aspx">...</a>

(si la respuesta procede de la aplicación de nóminas)

Advertencia

Cuando se modifican los encabezados de respuesta o el contenido de la respuesta mediante una regla de reescritura de salida, se debe tener precaución adicional para asegurarse de que el texto que se inserta en la respuesta no contiene ningún código ejecutable del lado cliente, lo que puede dar lugar a vulnerabilidades de scripting entre sitios. Esto es especialmente importante cuando la regla de reescritura usa datos que no son de confianza, como encabezados HTTP o la cadena de consulta, para compilar la cadena que se insertará en la respuesta HTTP. En tales casos, la cadena de reemplazo debe codificarse en HTML mediante la función HtmlEncode, por ejemplo:

<action type="Rewrite" value="{HtmlEncode:{HTTP_REFERER}}" />

Para crear la regla, 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 URL"
    Screenshot of the I I S Manager. The Connections pane shows an expanded navigation tree. Default Web Site is highlighted. In the Default Web Site Home pane, the U R L Rewrite icon is selected.
  4. En el panel Acciones del lado derecho, haga clic en "Agregar reglas...". En el cuadro de diálogo "Agregar reglas", seleccione "Regla en blanco" en la categoría "Reglas de salida" y haga clic en Aceptar:
    Screenshot of the Add rule dialog. Blank Rule under the Outbound Rules category is selected. Add Rules in the Actions pane is highlighted.

Ahora debe definir la regla de salida real. En el Módulo URL Rewrite 2.0, se define una regla de reescritura de salida especificando la siguiente información:

  • 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 en la respuesta.
  • Un 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: "Agregar prefijo de aplicación".

Definir 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 Editor de condición previa, 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 the Add Pre condition dialog box. RESPONSE CONTENT TYPE is written in the Input column. Matches the pattern is written in the Type column. Text slash h t m l is written in the Pattern column.

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

Definir un ámbito coincidente

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>

Definir 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 ruta de acceso de dirección URL que empiece por el símbolo "/".

Tenga en cuenta el uso de paréntesis dentro del patrón. Estos paréntesis crean un grupo de capturas, al que se puede hacer referencia más adelante en la regla mediante referencias inversas.

Definición de una condición

Debe cambiar los vínculos en el HTML de respuesta solo si la respuesta procede del correo web o de la aplicación de nóminas. Para comprobar que usará una condición que analice la ruta de acceso URL solicitada por el cliente. También definirá un patrón de condición que capture la carpeta de la aplicación de la dirección URL solicitada, de modo que la regla pueda volver a usarla al volver a escribir los vínculos en la respuesta.

  1. Expanda el cuadro de grupo de condiciones.
  2. Haga clic en el botón "Agregar..." a fin de abrir el cuadro de diálogo para definir condiciones.
  3. En "Condition input:" escriba esta cadena: "{URL}". Esto configura el módulo de reescritura de direcciones URL para usar la ruta de acceso URL solicitada por el cliente web.
  4. En el cuadro combinado desplegable, seleccione "Coincide con el patrón".
  5. Escriba ^/(webmail|payroll)/.* en el cuadro de texto Patrón. Esta expresión regular se usa para buscar coincidencias con las rutas de acceso de URL que comienzan por /webmail o /payroll. Los paréntesis dentro del patrón capturan la parte de la cadena de la URL coincidente, de modo que se pueda reutilizar al construir la dirección URL de reemplazo.
  6. Haga clic en Aceptar para guardar la condición y volver a la interfaz de usuario "Agregar regla".

Definir una acción

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

/{C:1}/{R:1}

Esta cadena especifica el nuevo valor que se debe reescribir en la dirección del vínculo. {C:1} es una referencia inversa al grupo de captura de patrones de condición y se sustituirá por las cadenas "webmail" o "payroll". {R:1} es una referencia inversa al grupo de captura del patrón de regla y, en este caso, se sustituirá por la ruta de acceso de dirección URL original que se usó en el hipervínculo.

Deje los valores predeterminados restantes. La página de propiedades "Editar regla de salida" debe ser similar a la siguiente:

Screenshot of the Edit Outbound Rule property page. The Match, Conditions, and Action categories are shown.

Guarde la regla haciendo clic en la acción "Aplicar" en el lado derecho.

Para comprobar la configuración de las reglas que acabamos de crear, abra un archivo web.config ubicado en %SystemDrive%\inetput\wwwroot\. En este archivo debería ver la sección <rewrite> que contiene esta definición de regla:

<rewrite>
    <rules>
        <rule name="Reverse Proxy to webmail" stopProcessing="true">
            <match url="^webmail/(.*)" />
            <action type="Rewrite" url="http://localhost:8081/{R:1}" />
        </rule>
        <rule name="Reverse Proxy to payroll" stopProcessing="true">
            <match url="^payroll/(.*)" />
            <action type="Rewrite" url="http://localhost:8082/{R:1}" />
        </rule>
    </rules>
    <outboundRules>
        <rule name="Add application prefix" preCondition="IsHTML">
            <match filterByTags="A" pattern="^/(.*)" />
            <conditions>
                <add input="{URL}" pattern="^/(webmail|payroll)/.*" />
            </conditions>
            <action type="Rewrite" value="/{C:1}/{R:1}" />
        </rule>
        <preConditions>
            <preCondition name="IsHTML">
                <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
            </preCondition>
        </preConditions>
    </outboundRules>
</rewrite>

Probar la regla

Para probar que la regla reescribe correctamente las direcciones URL en la respuesta, abra un explorador web y realice una solicitud a http://localhost/webmail/default.aspx o http://localhost/payroll/default.aspx. Debería ver que la regla de reescritura de salida ha cambiado el vínculo dentro de la respuesta HTML:

Screenshot of the Reverse Proxy Test Page Web Mail Application. The link at the bottom is h t t p colon slash slash local host slash web mail slash default dot a s p x.

Resumen

En este tutorial ha aprendido a configurar el módulo de reescritura de direcciones URL y el enrutamiento de solicitud de aplicaciones para implementar un escenario de proxy inverso. También ha aprendido a usar la nueva característica de reescritura de salida del módulo 2.0 de reescritura de direcciones URL para corregir los vínculos en las respuestas de las aplicaciones antes de servirlos al cliente web.

Tenga en cuenta que, al usar el proxy inverso, a menudo también es necesario volver a escribir los encabezados de respuesta HTTP. Para aprender a usar el módulo 2.0 de reescritura de direcciones URL para modificar el encabezado HTTP de respuesta, consulte Modificación de encabezados de respuesta HTTP.