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:

  1. IIS 7.0 oder höher mit aktiviertem ASP.NET-Rollendienst
  2. 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:

  1. Erstellen Sie im Ordner %SystemDrive%\inetpub\wwwroot\ zwei Ordner namens „blog“ und „forum“.

  2. 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>
    
  3. 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>
    
  4. Ö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:

  1. Navigieren Sie zum IIS-Manager.
  2. Wählen Sie in der Navigationsstrukturansicht den Serverknoten aus.
  3. Wählen Sie in der Featureansicht die Option „URL-Rewrite-Modul“ aus.
    Screenshot of the WIN two K eight R T M home page. The U R L Rewrite icon is highlighted.
  4. Wählen Sie im Bereich „Aktionen“ die Option „Regeln hinzufügen“ aus.
    Screenshot of the U R L Rewrite page. In the Actions pane Add Rules is highlighted.
  5. Wählen Sie im Dialogfeld „Regeln hinzufügen“ zunächst „Leere Regel“ und dann „OK“ aus:
    Screenshot of the Add Rules dialog box. The Blank Rule icon is selected.

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:

Screenshot of the Edit Rule page. In the Conditions category, Add Conditions is highlighted.

Wählen Sie die Schaltfläche „Hinzufügen“ aus, um das Dialogfeld zum Definieren von Bedingungen zu öffnen.

Screenshot of the Edit Rule page. The Add button in the Conditions category is highlighted.
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:

Screenshot of the Edit Condition dialog box. In the Condition input box the text bracket H T T P underscore HOST close bracket is written. The Ignore case checkbox is checked.

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:

Screenshot of the Edit Rule page. The Input, Type, and Pattern columns all have text.

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:

  1. 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}“.
  2. Der Hostheaderwert („blog_localhost“) wird erfolgreich mit dem regulären Ausdruck „^([^_]+)_[^_]+“ abgeglichen, und als Ergebnis wird „blog“ in einem Bedingungsrückverweis „{C:1}“ erfasst.
  3. 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

Screenshot of the U R L Rewrite Module Test Page. The Server Variable information and the Value information is shown.

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

  1. 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}&amp;title={R:2}"/>
            </rule>
          </rules>
        </rewrite>
      </system.webServer>
    </configuration>
    
  2. 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}&amp;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.

Screenshot of the U R L Rewrite Module Test Page. The U R L string has changed.

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.