Share via


Proxy inverso con URL Riscrivere v2 e Routing richiesta applicazione

di Ruslan Yakushev

Questa procedura dettagliata illustra come usare il modulo di riscrittura url e il routing delle richieste di applicazione (ARR) per implementare un server proxy inverso per più applicazioni back-end.

Prerequisiti

Per eseguire questa procedura dettagliata, è necessario disporre dei seguenti elementi:

  1. IIS 7 o versione successiva con ASP.NET servizio ruolo abilitato.
  2. URL Riscrivere modulo installato (versione 2.0 è necessario se si vuole completare la parte relativa alla riscrittura della risposta)
  3. Routing richieste applicazione versione 1.0 o versione 2.0 installata

Introduzione

Usando il modulo di riscrittura url e il routing delle richieste di applicazione è possibile implementare configurazioni di carico complesse e flessibili e di proxy inverso. Uno scenario proxy inverso molto comune consiste nel rendere disponibili diverse applicazioni Web interne su Internet. Un server Web accessibile da Internet viene usato come server proxy inverso che riceve richieste Web e li inoltra a diverse applicazioni Intranet per l'elaborazione: la figura seguente illustra una configurazione tipica per uno scenario proxy inverso:

Diagramma di una configurazione tipica per uno scenario proxy inverso.

Supponendo che il server ARR disponga di un nome http://contoso.comdi dominio , ogni applicazione Web può essere accessibile usando questi URL:

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

Quando viene effettuata una richiesta a , ARR inoltra queste richieste a http://contoso.com/webmail/default.aspxun server interno usando l'URL http://webmail/default.aspx. Analogamente, le richieste da http://contoso.com/payroll/ inoltrare a http://payroll/default.aspx.

Inoltre, se l'applicazione interna inserisce collegamenti nel codice HTML di risposta che si collega a un'altra posizione in tali applicazioni, tali collegamenti devono essere modificati prima che venga restituita la risposta al client. Ad esempio, una pagina da http://webmail/default.aspx potrebbe contenere un collegamento simile al seguente:

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

Il server ARR dovrebbe quindi modificare questo collegamento al seguente:

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

Creazione dei siti Web di esempio

Per semplicità, lo scenario di proxy inverso con cui si funzionerà in questa procedura dettagliata verrà implementato in un singolo server, con iis "Sito Web predefinito" che funge da sito proxy inverso e webmail e applicazioni di pagamento ospitate in siti Web IIS separati nello stesso server.

Per creare i siti Web di esempio:

  1. Creare due cartelle denominate "webmail" e "payroll" nella cartella seguente:

    %SystemDrive%\inetpub\ folder.
    
  2. Creare due siti Web IIS denominati "webmail" e "payroll" che puntano alle cartelle corrispondenti in %SystemDrive%\inetpub\. Usare porte IP diverse per ogni sito.
    È possibile usare i comandi seguenti per creare i siti:

    %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. Creare un file denominato default.aspx nella cartella seguente:

    %SystemDrive%\inetpub\webmail
    
  4. Copiare il markup ASP.NET seguente, incollarlo nel file e salvare il file:

    <%@ 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. Creare un file denominato default.aspx nella cartella seguente:

    %SystemDrive%\inetpub\payroll
    
  6. Copiare il markup ASP.NET seguente, incollarlo nel file e salvare il file:

    <%@ 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. Per assicurarsi che i siti funzionino correttamente, aprire un'esplorazione Web e richiedere gli URL seguenti:

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

Configurazione delle regole per il proxy inverso

In questa sezione della procedura dettagliata verrà configurata la funzionalità proxy inversa per l'uso dei siti Web di esempio creati.

Abilitazione della funzionalità proxy inverso

La funzionalità proxy inverso è disabilitata per impostazione predefinita, quindi è necessario iniziare abilitandola.

  1. Aprire Gestione IIS
  2. Selezionare un nodo server nella visualizzazione albero sul lato sinistro e quindi fare clic sulla funzionalità "Routing richieste applicazione":
    Screenshot dell'I S Manager. Vengono visualizzate icone diverse. L'icona Routing richiesta applicazione è evidenziata.
  3. Selezionare la casella di controllo "Abilita proxy". Lasciare i valori predefiniti per tutte le altre impostazioni in questa pagina:
    Screenshot della pagina Routing richiesta applicazione. Abilitare il proxy è evidenziato e selezionato.

Creazione di una regola per l'applicazione webmail

Verranno create due regole di riscrittura:

  • Regola di riscrittura che eseguirà il proxy di qualsiasi richiesta all'applicazione webmail fino http://localhost:8081/ a quando il percorso URL richiesto inizia con "webmail".
  • Regola di riscrittura che eseguirà il proxy di qualsiasi richiesta di pagamento dell'applicazione al pagamento a http://localhost:8082/ condizione che il percorso URL richiesto inizi con "payroll".

Per aggiungere le regole di riscrittura del proxy inverso:

  1. Aprire il file web.config che si trova nel percorso seguente:

    %SystemDrive%\inetpub\wwwroot\
    
  2. Nell'elemento /configuration/system.webServer aggiungere quanto segue e quindi salvare il file:

    <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>
    

Per altre informazioni sulla creazione di regole di riscrittura, vedere Creazione di regole di riscrittura per il modulo di riscrittura URL.

Test della funzionalità proxy inverso

Aprire un Web browser e effettuare una richiesta a http://localhost/webmail/default.aspx. Verrà visualizzata la risposta dalla pagina di test webmail. Effettuare anche una richiesta a http://localhost/payroll/default.aspx. Verrà visualizzata la risposta dalla pagina di test del pagamento.

Screenshot dell'applicazione Posta Web della pagina di test proxy inverso. Nella parte inferiore è evidenziata la barra predefinito del punto predefinito della barra host locale U R L h t t p.

Si noti che in entrambi i casi il collegamento all'interno del punto di risposta punta a http://localhost/default.aspx. Se si fa clic su questo collegamento, verrà visualizzata la risposta 404 (File Not Found) dal server. Nella sezione successiva si apprenderà come creare una regola in uscita per correggere i collegamenti generati dal codice HTML della risposta generata dall'applicazione.

Configurazione delle regole per la riscrittura della risposta

Questa sezione della documentazione si applica all'URL Riscrivere modulo versione 2.0 per IIS 7.

Si definirà una regola in uscita che sostituisce tutti i collegamenti all'interno del codice HTML della risposta come indicato di seguito:

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

verrà sostituito con:

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

(se la risposta proviene dall'applicazione webmail)

e

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

(se la risposta proviene dall'applicazione di pagamento)

Avviso

Quando le intestazioni di risposta o il contenuto della risposta vengono modificate da una regola di riscrittura in uscita, è consigliabile prestare maggiore attenzione per assicurarsi che il testo inserito nella risposta non contenga codice eseguibile lato client, che può causare vulnerabilità di script cross-site. Ciò è particolarmente importante quando la regola di riscrittura usa dati non attendibili, ad esempio intestazioni HTTP o stringa di query, per compilare la stringa che verrà inserita nella risposta HTTP. In questi casi, la stringa di sostituzione deve essere codificata in formato HTML usando la funzione HtmlEncode , ad esempio:

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

Per creare la regola, seguire questa procedura:

  1. Passare a Gestione IIS
  2. Selezionare "Sito Web predefinito"
  3. Nella visualizzazione funzionalità fare clic su "Riscrittura URL"
    Screenshot dell'I S Manager. Il riquadro Connessioni mostra un albero di spostamento espanso. Il sito Web predefinito è evidenziato. Nel riquadro Home del sito Web predefinito è selezionata l'icona Di riscrittura R L.
  4. Nel riquadro Azioni sul lato destro fare clic su "Aggiungi regole...". Nella finestra di dialogo "Aggiungi regole" selezionare la categoria "Regola vuota" nella categoria "Regole in uscita" e fare clic su OK:
    Screenshot della finestra di dialogo Aggiungi regola. Regola vuota nella categoria Regole in uscita selezionata. È evidenziato il riquadro Aggiungi regole nel riquadro Azioni.

È ora necessario definire la regola effettiva in uscita. Nella regola di riscrittura URL 2.0 del modulo 2.0 viene definita una regola di riscrittura in uscita specificando le informazioni seguenti:

  • Nome della regola.
  • Precondizione facoltativa che controlla se questa regola deve essere applicata a una risposta.
  • Modello da usare per la corrispondenza della stringa nella risposta.
  • Set facoltativo di condizioni.
  • Azione da eseguire se un modello è corrispondente e tutti i controlli delle condizioni hanno avuto esito positivo.

Denominazione della regola

Nella casella di testo "Nome" immettere un nome che identifica in modo univoco la regola, ad esempio "Aggiungi prefisso applicazione".

Definizione di una precondizione

Una precondizione viene usata per valutare se la valutazione delle regole in uscita deve essere eseguita su una risposta. Ad esempio, se una regola che modifica il contenuto HTML, è consigliabile valutare solo le risposte HTTP con intestazione di tipo contenuto impostata su "text/html". La valutazione delle regole in uscita e la riscrittura del contenuto è un'operazione che può influire negativamente sulle prestazioni di un'applicazione Web. Pertanto, usare le precondizioni per limitare i casi in cui vengono applicate regole in uscita.

Poiché la regola che si sta creando deve essere applicata solo alle risposte HTML, si definirà una precondizione che verifica se il tipo di contenuto dell'intestazione di risposta HTTP è equialziale a "text/html".

Per definire una precondizione:

  1. Nell'elenco Pre-condizioni selezionare "<Crea nuova condizione pre-condizione...>".

  2. Verrà visualizzata la finestra di dialogo Dell'editor pre-condizione, in cui sarà necessario definire la precondizione. Specificare le impostazioni di precondizione come indicato di seguito:

    • Nome: "IsHTML"

    • Uso: "Espressioni regolari"

    • Fare clic su "Aggiungi" per visualizzare la finestra di dialogo "Aggiungi condizione". In questa finestra di dialogo specificare:

      • Input della condizione: "{RESPONSE_CONTENT_TYPE}"

      • Controllare se la stringa di input: "Corrisponde al modello"

      • Modello: "^text/html"

        Screenshot della finestra di dialogo Aggiungi condizione preliminare. RESPONSE CONTENT TYPE è scritto nella colonna Input. Corrisponde al criterio scritto nella colonna Tipo. La barra di testo h t m l viene scritta nella colonna Pattern.

  3. Fare clic su OK per salvare la precondizione e tornare alla pagina "Modifica regola".

Definizione di un ambito corrispondente

La regola di riscrittura in uscita può operare sul contenuto di un'intestazione HTTP o sul contenuto del corpo della risposta. Questa regola deve sostituire i collegamenti nel contenuto della risposta, quindi nell'elenco a discesa "Ambito corrispondente" scegliere "Risposta".

Definizione di un filtro tag

I filtri tag vengono usati per definire l'ambito del criterio corrispondente solo a determinati elementi HTML, anziché valutare l'intera risposta rispetto al modello della regola. La corrispondenza dei criteri è un'operazione a elevato utilizzo di CPU e, se un'intera risposta viene valutata in base a un modello, può rallentare significativamente il tempo di risposta dell'applicazione Web. I filtri tag consentono di specificare che i criteri di ricerca devono essere applicati solo all'interno del contenuto di determinati tag HTML, riducendo in modo significativo la quantità di dati che devono essere valutati rispetto al criterio di espressione regolare.

Per definire un filtro tag, espandere l'elenco a discesa "Trova la corrispondenza del contenuto all'interno di" e quindi selezionare e selezionare la casella di controllo "A (attributo href)".

In questo modo la regola viene impostata per applicare il criterio solo al valore dell'attributo href del collegamento ipertestuale, come nell'esempio seguente:

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

Definizione di un modello

Nella casella di testo "Pattern" immettere la stringa seguente:

^/(.*)

Questa stringa è un'espressione regolare che specifica che il criterio corrisponderà a qualsiasi stringa di percorso URL che inizia con il simbolo "/".

Si noti l'utilizzo delle parentesi all'interno del modello. Queste parentesi creano un gruppo di acquisizione, a cui è possibile fare riferimento in un secondo momento nella regola usando i riferimenti back-reference.

Definizione di una condizione

È necessario modificare i collegamenti nel codice HTML della risposta solo se la risposta proviene dall'applicazione webmail o payroll. Per verificare che si userà una condizione che analizza il percorso URL richiesto dal client. Verrà inoltre definito un modello di condizione che acquisisce la cartella dell'applicazione dall'URL richiesto, in modo che la regola possa riutilizzare tale condizione durante la riscrittura dei collegamenti nella risposta.

  1. Espandere la casella di gruppo condizioni.
  2. Fare clic su "Aggiungi..." per visualizzare la finestra di dialogo per la definizione delle condizioni.
  3. Per "Condition input:" immettere questa stringa: "{URL}". In questo modo viene configurato il modulo di riscrittura URL per l'uso del percorso URL richiesto dal client Web.
  4. Nella casella combinata a discesa selezionare "Corrisponde al modello".
  5. Immettere nella casella di testo Pattern .Enter ^/(webmail|payroll)/.* in the Pattern textbox. Questa espressione regolare viene usata per trovare le corrispondenze con i percorsi URL che iniziano con /webmail o /payroll. La parentesi all'interno del modello acquisisce la parte della stringa URL corrispondente, in modo che possa essere usata durante la costruzione dell'URL sostitutivo.
  6. Fare clic su OK per salvare la condizione e tornare all'interfaccia utente "Aggiungi regola".

Definizione di un'azione

Scegliere il tipo di azione "Riscrivi" elencato nella casella di gruppo "Azione". Nella casella di testo "Valore" immettere la stringa seguente:

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

Questa stringa specifica il nuovo valore a cui deve essere riscritto l'indirizzo del collegamento. {C:1} è un back-reference al gruppo di acquisizione dei criteri di condizione e verrà sostituito con stringhe "webmail" o "payroll". {R:1} è un riferimento indietro al gruppo di acquisizione dei criteri di regola e in questo caso specifico verrà sostituito con il percorso URL originale usato nel collegamento ipertestuale.

Lasciare i valori predefiniti per tutte le altre impostazioni. La pagina delle proprietà "Modifica regola in uscita" dovrebbe essere simile alla seguente:

Screenshot della pagina delle proprietà Modifica regola in uscita. Vengono visualizzate le categorie Corrispondenza, Condizioni e Azione.

Salvare la regola facendo clic sull'azione "Applica" sul lato destro.

Per controllare la configurazione delle regole appena create, aprire un file web.config che si trova in %SystemDrive%\inetput\wwwroot\. In questo file verrà visualizzata la sezione che contiene questa definizione di <rewrite> regola:

<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>

Test della regola

Per verificare che la regola riscriva correttamente gli URL nella risposta, aprire un Web browser e effettuare una richiesta a http://localhost/webmail/default.aspx o http://localhost/payroll/default.aspx. Si noterà che la regola di riscrittura in uscita ha modificato il collegamento all'interno della risposta HTML:

Screenshot dell'applicazione Posta Web della pagina test del proxy inverso. Il collegamento nella parte inferiore è h t t t p slash slash local host slash web mail slash default dot a s p x.

Riepilogo

In questa procedura dettagliata si è appreso come configurare il modulo di riscrittura URL e il routing delle richieste di applicazione per implementare uno scenario di proxy inverso. Si è anche appreso come usare la nuova funzionalità di riscrittura in uscita del modulo di riscrittura URL 2.0 per correggere i collegamenti nelle risposte delle applicazioni prima di gestirli nel client Web.

Si noti che quando si usa il proxy inverso è spesso necessario riscrivere anche le intestazioni di risposta HTTP. Per informazioni su come usare url Rewrite Module 2.0 per modificare l'intestazione HTTP della risposta, vedere Modifica delle intestazioni di risposta HTTP.