Reverseproxy mit URL Rewrite v2 und Anwendungsanforderungsrouting
von Ruslan Yakushev
In dieser exemplarischen Vorgehensweise wird beschrieben, wie Sie das URL-Rewrite-Modul und das Routing von Anwendungsanforderungen (Application Request Routing; ARR) verwenden, um einen Reverseproxyserver für mehrere Back-End-Anwendungen zu implementieren.
Voraussetzungen
Zum Durchführen dieser exemplarischen Vorgehensweise benötigen Sie Folgendes:
- IIS 7 oder höher mit aktiviertem ASP.NET-Rollendienst.
- URL-Rewrite-Modul installiert (Version 2.0 ist erforderlich, wenn Sie den Teil zum Umschreiben von Antworten abschließen möchten)
- ARR Version 1.0 oder Version 2.0 installiert
Einführung
Das URL-Rewrite-Modul und ARR ermöglichen die Implementierung von komplexen, flexiblen Lastenausgleichs- und Reverseproxykonfigurationen. Ein sehr häufiges Reverseproxyszenario besteht darin, mehrere interne Webanwendungen über das Internet verfügbar zu machen. Ein über das Internet zugänglicher Webserver wird als Reverseproxyserver verwendet, der Webanforderungen empfängt und diese dann zur Verarbeitung an mehrere Intranetanwendungen weiterleitet: Die folgende Abbildung zeigt eine typische Konfiguration für ein Reverseproxyszenario:
Davon ausgehend, dass der ARR-Server den Domänennamen http://contoso.com
hat, kann über diese URLs auf jede Webanwendung zugegriffen werden:
http://contoso.com/webmail/
http://contoso.com/payroll/
Wenn http://contoso.com/webmail/default.aspx
aufgerufen wird, leitet ARR diese Anforderungen mithilfe der URL http://webmail/default.aspx
an einen internen Server weiter. Ebenso werden Aufrufe von http://contoso.com/payroll/
an http://payroll/default.aspx
weitergeleitet.
Wenn die interne Anwendung Links in den Antwort-HTML-Code einfügt, der an eine andere Stelle in diesen Anwendungen verweist, sollten diese Links geändert werden, bevor die Antwort an den Client zurückgegeben wird. Beispielsweise kann eine Seite aus http://webmail/default.aspx
einen Link wie diesen enthalten:
<a href="/default.aspx?id=1">link</a>
Der ARR-Server sollte diesen Link wie folgt ändern:
<a href="/webmail/default.aspx?id=1">link</a>
Erstellen der Beispielwebsites
Der Einfachheit halber wird das Reverseproxyszenario, mit dem Sie in dieser exemplarischen Vorgehensweise arbeiten, auf einem einzelnen Server implementiert, wobei die IIS-Standardwebsite als Reverseproxywebsite fungiert, während die Webmail- und Lohnbuchhaltungsanwendungen auf separaten IIS-Websites auf demselben Server gehostet werden.
So erstellen Sie die Beispielwebsites:
Erstellen Sie zwei Ordner namens „webmail“ und „payroll“ im folgenden Ordner:
%SystemDrive%\inetpub\ folder.
Erstellen Sie zwei IIS-Websites namens „webmail" und „payroll“, die auf entsprechende Ordner unter
%SystemDrive%\inetpub\
verweisen. Verwenden Sie für jeden Standort unterschiedliche IP-Ports.
Sie können die folgenden Befehle verwenden, um die Websites zu erstellen:%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"
Erstellen Sie eine Datei mit dem Namen „default.aspx“ im folgenden Ordner:
%SystemDrive%\inetpub\webmail
Kopieren Sie das folgende ASP.NET-Markup in die Datei, und speichern Sie die Datei:
<%@ 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>
Erstellen Sie eine Datei mit dem Namen „default.aspx“ im folgenden Ordner:
%SystemDrive%\inetpub\payroll
Kopieren Sie das folgende ASP.NET-Markup in die Datei, und speichern Sie die Datei:
<%@ 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>
Um sicherzustellen, dass die Sites ordnungsgemäß funktionieren, öffnen Sie einen Webbrowser, und rufen Sie die folgenden URLs auf:
http://localhost:8081/default.aspx
http://localhost:8082/default.aspx
Konfigurieren von Regeln für den Reverseproxy
In diesem Abschnitt der exemplarischen Vorgehensweise konfigurieren Sie die Reverseproxyfunktionalität für die von Ihnen erstellten Beispielwebsites.
Aktivieren von Reverseproxyfunktionen
Die Reverseproxyfunktion ist standardmäßig deaktiviert, daher müssen Sie sie zunächst aktivieren.
- Öffnen Sie den IIS-Manager.
- Wählen Sie in der Strukturansicht auf der linken Seite einen Serverknoten aus, und klicken Sie dann auf das Feature „Routing von Anwendungsanforderungen“:
- Aktivieren Sie das Kontrollkästchen „Proxy aktivieren“. Behalten Sie die Standardwerte für alle anderen Einstellungen auf dieser Seite bei:
Erstellen einer Regel für die Webmailanwendung
Sie werden zwei Umschreibregeln erstellen:
- Eine Umschreibregel, die jede Anforderung an die Webmailanwendung an
http://localhost:8081/
weiterleitet, solange die angeforderte URL mit „webmail“ beginnt. - Eine Umschreibregel, die jede Anforderung an die Lohnbuchhaltungsanwendung an
http://localhost:8082/
weiterleitet, solange die angeforderte URL mit „payroll“ beginnt.
So fügen Sie die Reverseproxy-Umschreibregeln hinzu:
Öffnen Sie die Datei web.config am folgenden Speicherort:
%SystemDrive%\inetpub\wwwroot\
Fügen Sie unter dem Element /configuration/system.webServer Folgendes hinzu, und speichern Sie die Datei:
<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>
Weitere Informationen zum Erstellen von Umschreibregeln finden Sie unter Erstellen von Umschreibungsregeln für das URL-Rewrite-Modul.
Testen der Reverseproxyfunktionalität
Öffnen Sie einen Webbrowser und rufen Sie http://localhost/webmail/default.aspx
auf. Sie sollten eine Antwort von der Webmailtestseite sehen. Rufen Sie nun auch http://localhost/payroll/default.aspx
auf. Sie sollten eine Antwort von der Lohnbuchhaltungstestseite sehen.
Beachten Sie, dass in beiden Fällen der Link innerhalb der Antwort auf http://localhost/default.aspx
verweist. Wenn Sie auf diesen Link klicken, erhalten Sie vom Server eine 404-Antwort (Datei nicht gefunden). Im nächsten Abschnitt erfahren Sie, wie Sie eine Ausgangsregel erstellen, um die Links in der von der Anwendung generierten HTML-Antwort zu reparieren.
Konfigurieren von Regeln für das Umschreiben von Antworten
Dieser Abschnitt der Dokumentation bezieht sich auf URL Rewrite in der Modulversion 2.0 für IIS 7.
Sie definieren eine Ausgangsregel, die alle Links innerhalb des Antwort-HTML-Codes wie folgt ersetzt:
<a href="/default.aspx">...</a>
wird ersetzt durch:
<a href="/webmail/default.aspx">...</a>
(wenn die Antwort von der Webmailanwendung stammt)
and
<a href="/payroll/default.aspx">...</a>
(wenn die Antwort von der Lohnbuchhaltungsanwendung stammt)
Warnung
Wenn Antwortheader oder der Antwortinhalt von einer Rewrite-Ausgangsregel geändert werden, sollte eine zusätzliche Vorsichtsmaßnahme ergriffen werden, um sicherzustellen, dass der Text, der in die Antwort eingefügt wird, keinen clientseitigen ausführbaren Code enthält, was zu websiteübergreifenden Scripting-Sicherheitsrisiken führen kann. Das ist besonders wichtig, wenn beim Umschreiben der Regel nicht vertrauenswürdige Daten verwendet werden, z. B. HTTP-Header oder die Abfragezeichenfolge, um die Zeichenfolge zu erstellen, die in die HTTP-Antwort eingefügt wird. In solchen Fällen sollte die Ersatzzeichenfolge mit der Funktion HtmlEncode HTML-codiert werden, z. B.:
<action type="Rewrite" value="{HtmlEncode:{HTTP_REFERER}}" />
Führen Sie zum Erstellen der Regel die folgenden Schritte aus:
- Navigieren Sie zum IIS-Manager.
- Klicken Sie auf „Standardwebsite“.
- Wählen Sie in der Featureansicht die Option „URL umschreiben“ aus.
- Klicken Sie im Bereich „Aktionen“ auf der rechten Seite auf „Regeln hinzufügen...“. Wählen Sie im Dialogfeld „Regeln hinzufügen“ die „Leere Regel“ unter der Kategorie „Ausgangsregeln“ aus, und klicken Sie auf „OK“.
Jetzt müssen Sie die eigentliche Ausgangsregel definieren. Im URL-Rewrite-Modul 2.0 wird eine Rewrite-Ausgangsregel durch Angabe der folgenden Informationen definiert:
- Name der Regel.
- Eine optionale Vorbedingung, die steuert, ob die Regel auf eine Antwort angewendet werden soll.
- Das Muster, das für den Abgleich mit der Zeichenfolge in der Antwort verwendet werden soll.
- Eine optionale Reihe von Bedingungen.
- Die Aktion, die ausgeführt werden soll, wenn ein Muster übereinstimmt und alle Bedingungsprüfungen erfolgreich waren.
Benennen der Regel
Geben Sie in das Textfeld „Name“ einen Namen ein, der die Regel eindeutig identifiziert, z. B.: „Anwendungspräfix hinzufügen“.
Definieren einer Vorbedingung
Eine Vorbedingung wird verwendet, um festzustellen, ob die Ausgangsregel für eine Antwort ausgewertet werden soll. Wenn beispielsweise eine Regel HTML-Inhalte ändert, sollten nur HTTP-Antworten, deren Content-Type-Header auf „text/html“ gesetzt ist, anhand dieser Regel ausgewertet werden. Die Auswertung von Ausgangsregeln und das Umschreiben von Inhalten ist ein CPU-intensiver Vorgang, der sich negativ auf die Leistung einer Webanwendung auswirken kann. Verwenden Sie daher Vorbedingungen, um die Fälle einzugrenzen, in denen Ausgangsregeln angewendet werden.
Da die zu erstellende Regel nur auf HTML-Antworten angewendet werden soll, definieren Sie eine Vorbedingung, die überprüft, ob der Inhaltstyp des HTTP-Antwortheaders gleich „text/html“ ist.
So definieren Sie eine Vorbedingung:
Wählen Sie in der Liste „Vorbedingungen“ die Option „<Neue Vorbedingung erstellen...>“ aus.
Dadurch gelangen Sie zum Dialogfeld „Vorbedingungs-Editor“, in dem Sie die Vorbedingung definieren müssen. Legen Sie die Vorbedingung wie folgt fest:
Name: „IsHTML“
Verwendet: „Reguläre Ausdrücke“
Klicken Sie auf „Hinzufügen“, um das Dialogfeld „Bedingung hinzufügen“ anzuzeigen. Geben Sie in diesem Dialogfeld Folgendes an:
Klicken Sie auf „OK“, um die Vorbedingung zu speichern und zur Seite „Regel bearbeiten“ zurückzukehren.
Definieren des Übereinstimmungsbereichs
Die Rewrite-Ausgangsregel kann den Inhalt eines HTTP-Headers oder den Antworttext verändern. Diese Regel soll Links im Antwortinhalt ändern. Wählen Sie daher in der Dropdown-Liste „Übereinstimmungsbereich“ die Option „Antwort“.
Definieren eines Tagfilters
Tagfilter werden verwendet, um den Musterabgleich auf bestimmte HTML-Elemente zu beschränken, anstatt die gesamte Antwort mit dem Regelmuster zu vergleichen. Der Musterabgleich ist ein sehr CPU-intensiver Vorgang. Wird die gesamte Antwort mit einem Muster verglichen, kann dies die Reaktionszeit der Webanwendung erheblich verlangsamen. Mit Tagfiltern können Sie angeben, dass der Musterabgleich auf den Inhalt bestimmter HTML-Tags beschränkt wird. Das verringert die Datenmenge, die mit dem RegEx-Muster verglichen werden muss, ganz erheblich.
Um einen Tagfilter zu definieren, erweitern Sie die Dropdownliste „Inhalt abgleichen in:“, und aktivieren Sie das Kontrollkästchen „A (href-Attribut)“.
Die Regel vergleicht das Muster dann nur mit dem Wert des href-Attributs des Hyperlinks, wie im folgenden Beispiel gezeigt:
<a href="this string will be used for pattern matching">Some link</a>
Definieren eines Musters
Geben Sie im Textfeld „Muster“ die folgende Zeichenfolge ein:
^/(.*)
Diese Zeichenfolge ist ein regulärer Ausdruck, der angibt, dass das Muster jeder URL-Pfadzeichenfolge entspricht, die mit dem Symbol „/“ beginnt.
Beachten Sie die Verwendung von Klammern innerhalb des Musters. Die Klammern erstellen eine Erfassungsgruppe, auf die später mithilfe von Rückverweisen in der Regel verwiesen werden kann.
Definieren einer Bedingung
Die Links im Antwort-HTML-Code sollten nur geändert werden, wenn die Antwort von der Webmail- oder Lohnbuchhaltungsanwendung stammt. Um das zu überprüfen, werden Sie eine Bedingung verwenden, die den vom Client angeforderten URL-Pfad analysiert. Außerdem werden Sie ein Bedingungsmuster definieren, das den Anwendungsordner aus der angeforderten URL erfasst, so dass die Regel diesen beim Umschreiben der Links in der Antwort wiederverwenden kann.
- Erweitern Sie das Gruppenfeld „Bedingungen“.
- Wählen Sie die Schaltfläche „Hinzufügen“ aus, um das Dialogfeld zum Definieren von Bedingungen zu öffnen.
- Geben Sie unter „Bedingungseingabe:“ diese Zeichenfolge ein: „{URL}“. Dadurch wird das URL-Rewrite-Modul so konfiguriert, dass der URL-Pfad verwendet wird, der vom Webclient angefordert wurde.
- Wählen Sie im Dropdown-Kombinationsfeld Entspricht dem Muster aus.
- Geben Sie im Textfeld Muster
^/(webmail|payroll)/.*
ein. Dieser reguläre Ausdruck wird verwendet, um die URL-Pfade abzugleichen, die entweder mit/webmail
oder/payroll
beginnen. Die Klammer innerhalb des Musters fängt den Teil der übereinstimmenden URL-Zeichenfolge ab, so dass er bei der Konstruktion der Ersatz-URL verwendet werden kann. - Wählen Sie „OK“ aus, um die Bedingung zu speichern und zur Benutzeroberfläche „Regel hinzufügen“ zurückzukehren.
Definieren einer Aktion
Wählen Sie den Aktionstyp „Umschreiben“ aus, der im Gruppenfeld „Aktion“ aufgeführt ist. Geben Sie im Textfeld „Wert“ die folgende Zeichenfolge ein:
/{C:1}/{R:1}
Diese Zeichenfolge gibt den neuen Wert an, in den die Linkadresse umgeschrieben werden soll. {C:1} ist ein Rückverweis auf die Erfassungsgruppe des Bedingungsmusters und wird durch die Zeichenfolgen „webmail“ oder „payroll“ ersetzt. {R:1} ist ein Rückverweis auf die Regelmustererfassungsgruppe und wird in diesem Fall durch den ursprünglichen URL-Pfad ersetzt, der im Link verwendet wurde.
Übernehmen Sie für alle anderen Einstellungen die Standardwerte. Die Eigenschaftenseite „Ausgangsregel bearbeiten“ sollte wie folgt aussehen:
Speichern Sie die Regel, indem Sie auf der rechten Seite die Aktion „Übernehmen“ auswählen.
Um die Konfiguration der soeben erstellten Regeln zu überprüfen, öffnen Sie eine „web.config“-Datei in %SystemDrive%\inetput\wwwroot\
. In dieser Datei sollte der Abschnitt <rewrite>
mit dieser Regeldefinition angezeigt werden:
<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>
Testen der Regel
Um zu testen, dass die Regel URLs in der Antwort ordnungsgemäß umschreibt, öffnen Sie einen Webbrowser, und rufen Sie http://localhost/webmail/default.aspx
oder http://localhost/payroll/default.aspx
auf. Sie sollten sehen, dass die Rewrite-Ausgangsregel den Link in der HTML-Antwort geändert hat:
Zusammenfassung
In dieser exemplarischen Vorgehensweise haben Sie erfahren, wie Sie das URL-Rewrite-Modul und das Routing von Anwendungsanforderungen konfigurieren, um ein Reverseproxyszenario zu implementieren. Außerdem haben Sie erfahren, wie Sie mit der neuen ausgehenden Umschreibfunktion des URL-Rewrite-Moduls 2.0 die Links in den Antworten der Anwendungen anpassen können, bevor Sie sie an den Webclient weiterleiten.
Beachten Sie, dass bei Verwendung des Reverseproxys häufig auch das Umschreiben der HTTP-Antwortheader erforderlich ist. Informationen zur Verwendung des URL-Rewrite-Moduls 2.0 zum Ändern des HTTP-Antwortheaders finden Sie unter Ändern von HTTP-Antwortheadern.