Verwenden globaler und verteilter Umschreibungsregeln
von Ruslan Yakushev
In dieser exemplarischen Vorgehensweise werden die verschiedenen Typen von Regeln erläutert, die vom URL-Rewrite-Modul unterstützt werden. Außerdem finden Sie hier Leitfäden zur Konfiguration globaler und verteilter Umschreibungsregeln.
Hintergrund
Globale Umschreibungsregeln dienen dazu, auf dem gesamten Server geltende URL-Umschreibungslogik zu definieren. Diese Regeln werden in der Datei „applicationHost.config“ definiert und können nicht auf niedrigeren Konfigurationsebenen außer Kraft gesetzt oder deaktiviert werden, z. B. für eine Website oder ein virtuelles Verzeichnis. Globale Regeln werden immer auf den absoluten URL-Pfad angewandt (d. h. auf den angeforderten URI ohne Servernamen). Wenn z. B. http://localhost/directory1/directory2/index.html
angefordert wurde, übergibt das URL-Rewrite-Modul „directory1/directory2/index.html“ als Eingabe an eine globale Regel.
Verteilte Umschreibungsregeln dienen dazu, URL-Umschreibungslogik zu definieren, die spezifisch für einen bestimmten Konfigurationsbereich ist. Verteilte Regeln können auf jeder Konfigurationsebene (mit Ausnahme der Dateiebene) über „Web.config“-Dateien definiert werden. Lokale Regeln werden immer relativ zum Speicherort der Datei „Web.config“, in der sie definiert sind, auf die URLs angewandt. Wenn beispielsweise http://localhost/directory1/directory2/index.html
angefordert wird und eine Umschreibungsregel in der Datei „Web.config“ in „directory1“ definiert wurde, übergibt das URL-Rewrite-Modul „directory2/index.html“ als Eingabe an diese Regel.
Der globale Regelsatz wird immer zuerst ausgewertet, und erst danach wird der verteilte Regelsatz mithilfe einer URL-Zeichenfolge ausgewertet, die von einem globalen Regelsatz erzeugt wurde.
Voraussetzungen
Für diese exemplarische Vorgehensweise wird Folgendes vorausgesetzt:
- IIS 7.0 oder höher mit aktiviertem ASP.NET-Rollendienst
- Installiertes Go Live-Release des URL-Rewrite-Moduls
Einrichten eines Szenarios für die exemplarische Vorgehensweise
Um zu veranschaulichen, wie globale und lokale Regeln verwendet werden, implementieren Sie ein allgemeines Szenario für die Zuordnung von Unterdomänen zu Verzeichnissen. Dies ermöglicht Ihnen, Unterdomänen für den Zugriff auf Inhalte in verschiedenen Verzeichnissen Ihrer Website zu verwenden. Benutzer und Benutzerinnen können z. B. anstelle von http://mysite.com/blog
zu http://blog.mysite.com
oder anstelle von http://mysite.com/forum
zu http://forum.mysite.com
navigieren.
Führen Sie zum Einrichten des Szenarios die folgenden Schritte aus:
Erstellen Sie im Ordner
%SystemDrive%\inetpub\wwwroot\
zwei Ordner namens „blog“ und „forum“.Kopieren Sie den folgenden ASP.NET-Code in eine Datei namens „article.aspx“ im Ordner
%SystemDrive%\inetpub\wwwroot\blog
:<%@ 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>
Kopieren Sie den folgenden ASP.NET-Code in eine Datei namens „forum.aspx“ im Ordner
%SystemDrive%\inetpub\wwwroot\forum
:<%@ 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>
Öffnen Sie die Datei „hosts“ in
%SystemDrive%\windows\system32\drivers\etc\
, und fügen Sie die folgenden beiden Zeilen ein:127.0.0.1 forum_localhost 127.0.0.1 blog_localhost
Nachdem Sie diese Zeilen hinzugefügt haben, öffnen Sie einen Webbrowser, und navigieren zu http://blog_localhost/blog/article.aspx und http://forum_localhost/forum/forum.aspx. Überprüfen Sie, ob die Seiten im Browser ordnungsgemäß gerendert wurden.
Erstellen einer globalen Umschreibungsregel
Zunächst erstellen Sie eine globale Umschreibungsregel, die die URL basierend auf dem Hostheader umschreibt. Wenn beispielsweise http://blog_localhost/article.aspx angefordert wurde, ändert die Regel den URL-Pfad in „/blog/article.aspx“.
Führen Sie die folgenden Schritte aus, um eine globale Regel mithilfe der Benutzeroberfläche des URL-Rewrite-Moduls im IIS-Manager zu erstellen:
- Navigieren Sie zum IIS-Manager.
- Wählen Sie in der Navigationsstrukturansicht den Serverknoten aus.
- Wählen Sie in der Featureansicht die Option „URL-Rewrite-Modul“ aus.
- Wählen Sie im Bereich „Aktionen“ die Option „Regeln hinzufügen“ aus.
- Wählen Sie im Dialogfeld „Regeln hinzufügen“ zunächst „Leere Regel“ und dann „OK“ aus:
Jetzt müssen Sie die eigentliche Umschreibungsregel definieren. Im URL-Rewrite-Modul wird eine Umschreibungsregel über vier Informationen definiert:
- Name der Regel
- Muster für den Abgleich der URL-Zeichenfolge
- Optionale Bedingungen
- Auszuführende Aktion, wenn das Muster übereinstimmt und alle Bedingungsprüfungen erfüllt sind
Benennen einer Regel
Geben Sie im Textfeld „Name“ einen Namen ein, der die Regel eindeutig identifiziert, z. B. „Subdomänenzuordnung“.
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-Zeichenfolge entspricht, einschließlich einer leeren Zeichenfolge, und übereinstimmende Zeichenfolgen in einem Rückverweis erfasst.
Definieren einer Bedingung
Wählen Sie die Schaltfläche „Bedingungen hinzufügen“ aus:
Wählen Sie die Schaltfläche „Hinzufügen“ aus, um das Dialogfeld zum Definieren von Bedingungen zu öffnen.
Geben Sie für „Bedingungseingabe:“ diese Zeichenfolge ein: {HTTP_HOST}. Dadurch wird das URL-Rewrite-Modul so konfiguriert, dass der Wert des Hostheaders der HTTP-Anforderung als Eingabe für die Bedingung verwendet wird.
Wählen Sie im Dropdown-Kombinationsfeld Entspricht dem Muster aus.
Geben Sie im Textfeld „Muster“ Folgendes ein: ^([^_]+)_[^_]+. Mit diesem regulären Ausdruck werden die Domänen abgeglichen, die Sie erstellt haben (blog_localhost und forum_localhost), dabei wird der Teil der Zeichenfolge vor dem Unterstrich („_“) in einem Rückverweis erfasst. Bei der Zeichenfolge blog_localhost wird z. B. blog im Rückverweis erfasst.
Nachdem alle Eigenschaften angegeben wurden, sollte das Dialogfeld der Bedingung wie folgt aussehen:
Wählen Sie „OK“ aus, um die Bedingung zu speichern und zur Benutzeroberfläche „Regel hinzufügen“ zurückzukehren.
Definieren einer Aktion
Da diese Regel die URL umschreiben soll, wählen Sie im Gruppenfeld „Aktion“ den Aktionstyp „Umschreiben“ aus. Geben Sie im Textfeld „URL umschreiben:“ die folgende Zeichenfolge ein:
{C:1}/{R:1}
Diese Zeichenfolge gibt an, in was die Eingabe-URL umgeschrieben werden soll. Der Rückverweis auf die Bedingung „{C:1}“ wird als Name des Ordners verwendet. Sämtliche im Regelmuster erfassten Elemente werden über einen Rückverweis auf die Regel „{R:1}“ beibehalten.
Übernehmen Sie für alle anderen Einstellungen die Standardwerte. Die Benutzeroberfläche „Regel bearbeiten“ sollte wie die folgende Seite aussehen:
Speichern Sie die Regel, indem Sie auf der rechten Seite die Aktion „Übernehmen“ auswählen.
Um zu verstehen, wie diese Regel angewandt wird, werden im Folgenden die Schritte durchlaufen, die vom URL-Rewrite-Modul ausgeführt werden, wenn der HTTP-Client diese URL anfordert:
http://blog_localhost/article.aspx?id=323
:
- Das URL-Rewrite-Modul übergibt „article.aspx?id=323“ als Eingabe-URL an die Regel, gleicht sie erfolgreich mit dem Regelmuster ab und erfasst sie in einem Regelrückverweis „{R:1}“.
- Der Hostheaderwert („blog_localhost“) wird erfolgreich mit dem regulären Ausdruck „^([^_]+)_[^_]+“ abgeglichen, und als Ergebnis wird „blog“ in einem Bedingungsrückverweis „{C:1}“ erfasst.
- Gemäß der Ersetzungszeichenfolge „{C:1}/{R:1}“ wird die URL in „blog/article.aspx?id=323“ umgeschrieben.
Testen der Regel
Um zu testen, ob die Regel die URL richtig umschreibt, öffnen Sie einen Internetbrowser, und fordern Sie die folgende URL an:
http://blog_localhost/article.aspx?id=123
Sie sollten sehen, dass das URL-Rewrite-Modul die URL geändert und die Seite „article.aspx“ im Verzeichnis „blog“ geöffnet hat. Die vom URL-Rewrite-Modul vorgenommenen Änderungen basieren auf den Informationen, die aus dem Hostheader extrahiert wurden.
Auf ähnliche Weise wird die URL bei der Anforderung von http://forum_localhost/forum.aspx?id=345
in /forum/forum.aspx?id=345 umgeschrieben.
Erstellen verteilter Regeln
Die oben erstellte globale Regel dient dazu, die Anforderung basierend auf den Informationen, die aus dem Hostheader extrahiert wurden, einem Ordner zuzuordnen. Nun erstellen Sie verteilte Regeln, mit denen Sie URLs ohne Abfragezeichenfolgenparameter verwenden können. Die verteilten Regeln verwenden als Eingabe die URL, die bereits von einer globalen Regel bearbeitet wurde, und nehmen weitere Änderungen daran vor. Dies gilt insbesondere für:
- Eine Umschreibungsregel im Ordner „blog“ schreibt den URL-Pfad von „article/234/some-title“ in „article.aspx?id=234&title=some-title“ um.
- Eine Umschreibungsregel im Ordner „forum“ schreibt den URL-Pfad von „topic/123/some-topic-title“ in „forum.aspx?topic=some-topic-title&id=123“ um.
Lokale Regeln können entweder mithilfe von IIS-Manager oder durch Bearbeiten von „web.config“-Dateien erstellt werden. Zu Demonstrationszwecken werden die Regeln hier durch manuelles Bearbeiten von „Web.config“-Dateien erstellt.
So erstellen Sie verteilte Umschreibungsregeln
Erstellen Sie eine leere Datei „Web.config“ im Ordner
%SystemDrive%\inetpub\wwwroot\**blog**
. Öffnen Sie sie in einem Text-Editor, und fügen Sie dann darin den folgenden XML-Code ein:<?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>
Erstellen Sie eine leere Datei „Web.config“ im Ordner
%SystemDrive%\inetpub\wwwroot\**forum**
. Öffnen Sie sie in einem Text-Editor, und fügen Sie dann darin den folgenden XML-Code ein:<?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>
Testen von globalen und verteilten Regeln
Um zu testen, dass alle Regeln ordnungsgemäß funktionieren, öffnen Sie einen Webbrowser, und stellen Sie eine Anforderung an http://blog_localhost/article/234/some-title
. Die Antwort im Browser sollte verdeutlichen, dass die URL zuerst durch eine globale Regel geändert und dann von einer verteilten Regel weiter bearbeitet wurde.
Wenn Sie http://forum_localhost/topic/123/some-topic-title
anfordern, sollten Sie sehen, dass das URL-Rewrite-Modul die angeforderte URL-Zeichenfolge entsprechend in „/forum/forum.aspx?topic=some-topic-title&id=123“ geändert hat.
Zusammenfassung
In diesem Tutorial haben Sie ein Szenario für die Unterdomänenzuordnung mithilfe einer globalen Regel implementiert und dann verteilte Regeln verwendet, um benutzerfreundliche URLs für Webseiten in diesen Ordnern zu verwenden.