Verwenden von Rewrite-Zuordnungen im URL-Rewrite-Modul

von Ruslan Yakushev

Diese exemplarische Vorgehensweise führt Sie in das Konzept der Rewrite-Zuordnungen im URL-Rewrite-Modul ein und zeigt Ihnen, wie Sie Rewrite-Regeln erstellen, die Rewrite-Zuordnungen verwenden. In dieser exemplarischen Vorgehensweise werden Sie zwei Rewrite-Zuordnungen erstellen: eine Rewrite-Zuordnung wird von der Regel verwendet, die das Umschreiben von URLs durchführt, und die andere Rewrite-Zuordnung wird von der Regel verwendet, die Umleitungen zu einer anderen Domäne durchführt.

Hintergrund

Eine Rewrite-Zuordnung ist eine beliebige Sammlung von Name/Wert-Paaren, die in Rewrite-Regeln verwendet werden können, um während des Umschreibens die Ersetzungs-URL zu generieren. Rewrite-Zuordnungen sind hilfreich, wenn Sie sehr viele Rewrite-Regeln haben, die alle statische Zeichenfolgen verwenden (also wenn kein Musterabgleich verwendet wird). In diesen Fällen können Sie anstelle vieler einfacher Rewrite-Regeln alle Zuordnungen in eine Rewrite-Zuordnung einfügen, indem Sie die Eingabe-URL als Schlüssel verwenden und die Ersetzungs-URL als Wert einfügen. Zum Suchen nach der Ersetzungs-URL ausgehend von der Eingabe-URL genügt dann eine einzige Rewrite-Regel, die diese Rewrite-Zuordnung referenziert.

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

Zum Veranschaulichen der Rewrite-Zuordnungsfunktionalität verwenden wir eine einfache ASP.net-Testseite. Diese Seite liest die Webservervariablen und gibt ihre Werte im Browser aus.

Kopieren Sie den folgenden ASP.NET-Code in eine Datei namens „article.aspx“ im Ordner %SystemDrive%\inetpub\wwwroot\:

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

Navigieren Sie nach dem Kopieren dieser Datei zu http://localhost/article.aspx, und überprüfen Sie, ob die Seite korrekt in einem Browser gerendert wurde.

Screenshot that shows the test page rendered in a browser.

Erstellen einer Zuordnung zum Umschreiben

Zunächst erstellen wir eine Rewrite-Zuordnung und eine Rewrite-Regel, die zum Umschreiben von URLs auf der Grundlage einer Reihe von statischen Zuordnungen zwischen Original-URLs und umgeschriebenen URLs verwendet werden. Gehen Sie folgendermaßen vor, um eine Rewrite-Zuordnung zu erstellen:

  1. Navigieren Sie zum IIS-Manager.

  2. Klicken Sie auf „Standardwebsite“.

  3. Wählen Sie in der Featureansicht die Option „URL umschreiben“ aus.
    Screenshot that shows U R L Rewrite in Features View.

  4. Klicken Sie im Bereich „Aktionen“ auf der rechten Seite auf „Rewrite-Zuordnungen anzeigen…“.
    Screenshot that shows View rewrite maps...

  5. Klicken Sie im Bereich „Aktionen“ auf der rechten Website auf „Rewrite-Zuordnung hinzufügen...“, und geben Sie dann für den Namen der Rewrite-Zuordnung „StaticRewrites“ ein:
    Screenshot that shows the Rewrite map name box.

  6. Klicken Sie auf der Seite der neu erstellten Rewrite-Zuordnung im Bereich „Aktionen“ auf der rechten Seite auf „Zuordnungseintrag hinzufügen...“, und geben Sie dann „/article“ und „/article.aspx?id=1&title=some-title“ für „Ursprünglicher Wert:“ bzw. „Neuer Wert:“ ein. Der ursprüngliche Wert gibt an, welcher URL-Pfad umgeschrieben werden soll; der neue Wert gibt an, wie der neue URL-Pfad lauten soll.
    Screenshot that shows the Original value and New value boxes.

  7. Wiederholen Sie Schritt 6, um die folgenden Zuordnungen zur Rewrite-Zuordnung hinzuzufügen:

    Ursprünglicher Wert: Neuer Wert:
    /some-title /article.aspx?id=1&title=some-title
    /post/some-title.html /article.aspx?id=1&title=some-title

Öffnen Sie nun die Datei „web.config“ Ihrer Website (wenn Sie „Standardwebsite“ verwenden, finden Sie die Datei „web.config“ unter %SystemDrive%\inetpub\wwwroot). Der folgende Abschnitt sollte angezeigt werden:

<rewrite>
    <rewriteMaps>
        <rewriteMap name="StaticRewrites" defaultValue="">
            <add key="/article1" value="/article.aspx?id=1&amp;title=some-title" />
            <add key="/some-title" value="/article.aspx?id=1&amp;title=some-title" />
            <add key="/post/some-title.html" value="/article.aspx?id=1&amp;title=some-title" />
        </rewriteMap>
    </rewriteMaps>
</rewrite>

Diese Rewrite-Zuordnung namens „StaticRewrites“ wird verwendet, um eingehende URLs (definiert als Schlüssel in der Rewrite-Zuordnung) in ihre internen Darstellungen (definiert als Werte) umzuschreiben. Das Attribut defaultValue gibt an, welcher Wert verwendet werden soll, wenn keine eingehende URL in der Zuordnung definiert wurde. In diesem Fall wird eine leere Zeichenfolge zurückgegeben.

Beachten Sie, dass es zwischen den Schlüsseln und den Werten kein offensichtliches gemeinsames Muster gibt. Das bedeutet, dass es nicht möglich ist, reguläre Ausdrücke oder Platzhalter zum Definieren der URL-Transformationslogik zu verwenden. Und das bedeutet auch, dass wir ohne Rewrite-Zuordnungen drei Rewrite-Regeln hätten erstellen müssen. Dank der Rewrite-Zuordnungen genügt eine Rewrite-Regel. Im nächsten Abschnitt wird erläutert, wie Sie eine Rewrite-Regel erstellen, die diese Rewrite-Zuordnung verwendet.

Verweisen auf eine Rewrite-Zuordnung von einer Rewrite-Regel

Um eine Rewrite-Regel zu erstellen, die die Rewrite-Zuordnungen verwendet, kopieren Sie den folgenden XML-Code, und fügen Sie ihn in den Abschnitt <rewrite> der Datei „web.config“ Ihrer Website ein:

<rules>
    <rule name="Rewrite Rule">
        <match url=".*" />
        <conditions>
            <add input="{StaticRewrites:{REQUEST_URI}}" pattern="(.+)" />
        </conditions>
        <action type="Rewrite" url="{C:1}" />
    </rule>
</rules>

Sehen wir uns an, was die einzelnen Regelelemente bewirken:
<match url=".*" /> – Dieses Element weist das URL-Rewrite-Modul an, jede eingehende URL abzugleichen (unter Verwendung des RegEx-Sonderzeichens „.“).

<add input="{StaticRewrites:{REQUEST\_URI}}" pattern="(.+)"> – Diese Bedingung prüft, ob der von der Rewrite-Zuordnung „StaticRewrites“ zurückgegebene Wert keine leere Zeichenfolge ist. Um diese Prüfung durchzuführen, wird der Wert der Servervariablen REQUEST_URI als Parameter an die Rewrite-Zuordnung übergeben. Wenn die Rewrite-Zuordnung einen Eintrag mit einem Schlüssel enthält, der mit REQUEST_URI übereinstimmt, dann wird der Wert zurückgegeben, der diesem Schlüssel entspricht. Das Muster des regulären Ausdrucks passt nur auf nicht leere Zeichenfolgen. Wenn also eine leere Zeichenfolge von der Zuordnung zurückgegeben wird, wird die Bedingung als falsch ausgewertet und es erfolgt keine Umschreibung. Wenn eine nicht leere Zeichenfolge zurückgegeben wurde, wird diese Zeichenfolge aufgrund der im Muster verwendeten Klammer in einem Rückverweis erfasst.

<action type="Rewrite" url="{C:1}" /> – Dieses Element gibt an, dass das URL-Rewrite-Modul die aktuelle URL-Zeichenfolge mit der neuen aus der Rewrite-Zuordnung extrahierten Zeichenfolge umschreiben muss. Beachten Sie, dass das url-Attribut auf den Rückverweis {C:1} der Bedingung verweist, der gesetzt wurde, als das Muster in der Bedingung erfüllt wurde.

Testen der Regel für das Umschreiben

Um die Rewrite-Regel, die die Zuordnung „StaticRewrites“ verwendet, zu testen, öffnen Sie einen Webbrowser, und rufen Sie eine der folgenden URLs auf:

http://localhost/article1
http://localhost/some-title
http://localhost/post/some-title.html

Jede der oben genannten URLs sollte dazu führen, dass die URL gemäß den in der Rewrite-Zuordnung definierten Zuordnungen umgeschrieben wird. Die Ergebnisse sollten der folgenden Seite entsprechen:

Screenshot that shows the results of the test.

Verwenden von Rewrite-Zuordnungen zur Umleitung

Jetzt erstellen wir eine weitere Rewrite-Zuordnung, die zum Definieren statischer Zuordnungen zwischen Quell-URLs und Umleitungs-URLs verwendet wird. Führen Sie zum Erstellen einer Rewrite-Zuordnung die gleichen Schritte aus wie im Abschnitt „Erstellen einer Zuordnung zum Umschreiben“ beschrieben, geben Sie ihr jedoch den Namen „StaticRedirects“, und verwenden Sie die folgenden Werte für die Zuordnungseinträge:

Ursprünglicher Wert: Neuer Wert:
/old-article.aspx?id=1 /article.aspx?id=1
/posts/default.aspx?id=1 /article.aspx?id=1
/old-title.html /article.aspx?id=1

Die Datei „web.config“ Ihrer Website sollte jetzt diese beiden Rewrite-Zuordnungen enthalten:

<rewriteMaps>
    <rewriteMap name="StaticRewrites">
        <add key="/article1" value="/article.aspx?id=1&amp;title=some-title" />
        <add key="/some-title" value="/article.aspx?id=1&amp;title=some-title" />
        <add key="/post/some-title.html" value="/article.aspx?id=1&amp;title=some-title" />
    </rewriteMap>
    <rewriteMap name="StaticRedirects">
        <add key="/old-article.aspx?id=1" value="/article.aspx?id=1" />
        <add key="/posts/default.aspx?id=1" value="/article.aspx?id=1" />
        <add key="/old-title.html" value="/article.aspx?id=1" />
    </rewriteMap>
</rewriteMaps>

Um eine Regel zu erstellen, die die Rewrite-Zuordnung „StaticRedirects“ verwendet, kopieren Sie die folgende Regeldefinition, und fügen Sie sie in die Datei „web.config“ Ihrer Website ein:

<rules>
    <rule name="Redirect Rule" stopProcessing="true">
        <match url=".*" />
        <conditions>
            <add input="{StaticRedirects:{REQUEST_URI}}" pattern="(.+)" />
        </conditions>
        <action type="Redirect" url="http://localhost{C:1}" appendQueryString="False" redirectType="Permanent" />
    </rule>
</rules>

Auch hier sehen wir uns wieder an, was die einzelnen Regelelemente bewirken:
<match url=".*" /> – Dieses Element weist das URL-Rewrite-Modul an, jede eingehende URL abzugleichen (unter Verwendung des RegEx-Sonderzeichens „.“).

<add input="{StaticRedirects:{REQUEST\_URI}}" pattern="(.+)"> – Diese Bedingung prüft, ob der von der Rewrite-Zuordnung StaticRedirects zurückgegebene Wert keine leere Zeichenfolge ist. Um diese Prüfung durchzuführen, wird der Wert der Servervariablen REQUEST_URI als Parameter an die Rewrite-Zuordnung übergeben. Wenn die Rewrite-Zuordnung einen Eintrag mit einem Schlüssel enthält, der mit REQUEST_URI übereinstimmt, dann wird der Wert zurückgegeben, der diesem Schlüssel entspricht. Das Muster des regulären Ausdrucks passt nur auf nicht leere Zeichenfolgen. Wenn also eine leere Zeichenfolge von der Zuordnung zurückgegeben wird, wird die Bedingung als falsch ausgewertet und es erfolgt keine Umschreibung. Wenn eine nicht leere Zeichenfolge zurückgegeben wurde, wird diese Zeichenfolge aufgrund der im Muster verwendeten Klammer in einem Rückverweis erfasst.

<action type="Redirect" url="http://localhost{C:1}" appendQueryString="False" redirectType="Permanent" /> – Dieses Element gibt an, dass das URL-Rewrite-Modul den Webclient auf eine neue URL umleiten muss, die durch Verkettung des neuen Domänennamens (in diesem Fall ist es der Einfachheit halber dieselbe Domäne) und des von der „StaticRedirects“-Zuordnung zurückgegebenen URL-Umleitungspfads erstellt wird.

Testen der Regel für die Umleitung

Um die Rewrite-Regel, die die Zuordnung „StaticRedirects“ verwendet, zu testen, öffnen Sie einen Webbrowser, und rufen Sie eine der folgenden URLs auf:

http://localhost/old-article
http://localhost/posts/default.aspx?id=1
http://localhost/old-title.html

Jede der oben genannten URLs sollte dazu führen, dass der Browser zu http://localhost/article.aspx?id=1umgeleitet wird.

Verwenden von Rewrite-Zuordnungen für Abfragezeichenfolgenparameter

Die Verwendung von Rewrite-Zuordnungen ist nicht auf die oben genannten Beispiele beschränkt. Eine Rewrite-Zuordnung ist eine generische Auflistung von Schlüssel-Wert-Paaren, die überall in einer Rewrite-Regel verwendet werden können. Um dies zu veranschaulichen, erstellen wir eine Rewrite-Zuordnung, die für die Manipulation von Abfragezeichenfolgenparametern verwendet werden kann.

Erstellen Sie eine dritte Rewrite-Zuordnung, indem Sie die gleichen Schritte ausführen wie im Abschnitt „Erstellen einer Zuordnung zum Umschreiben“ beschrieben. Nennen Sie die Rewrite-Zuordnung „IDtoTitleMap“, und verwenden Sie die folgenden Werte für die Zuordnungseinträge:

Ursprünglicher Wert: Neuer Wert:
1 some-title-1
2 some-title-2
3 some-title-3

Die Datei „web.config“ Ihrer Website sollte jetzt diese beiden Rewrite-Zuordnungen enthalten:

<rewriteMaps>
    <rewriteMap name="StaticRewrites">
        <add key="/article1" value="/article.aspx?id=1&amp;title=some-title" />
        <add key="/some-title" value="/article.aspx?id=1&amp;title=some-title" />
        <add key="/post/some-title.html" value="/article.aspx?id=1&amp;title=some-title" />
    </rewriteMap>
    <rewriteMap name="StaticRedirects">
        <add key="/old-article.aspx?id=1" value="/article.aspx?id=1" />
        <add key="/posts/default.aspx?id=1" value="/article.aspx?id=1" />
        <add key="/old-title.html" value="/article.aspx?id=1" />
    </rewriteMap>
    <rewriteMap name="IDtoTitleMap">
        <add key="1" value="some-title-1" />
        <add key="2" value="some-title-2" />
        <add key="3" value="some-title-3" />
    </rewriteMap>
</rewriteMaps>

Um eine Regel zu erstellen, die die Rewrite-Zuordnung IDtoTitleMap verwendet, kopieren Sie die folgende Regeldefinition, und fügen Sie sie in die Datei „web.config“ Ihrer Website ein:

<rules>
    <rule name="Query String Rule" stopProcessing="true">
        <match url="^article\.aspx$" />
        <conditions>
            <add input="{QUERY_STRING}" pattern="(?:^|&)id=([0-9]+)(?:&|$)" />
            <add input="{IDtoTitleMap:{C:1}}" pattern="(.+)" />
        </conditions>
        <action type="Redirect" url="article.aspx?title={C:1}" appendQueryString="False" 
                                                            redirectType="Permanent" />
    </rule>
</rules>

Sehen wir uns an, was die einzelnen Regelelemente bewirken:
<match url="^article\.aspx$" /> – Dieses Element weist das URL-Rewrite-Modul an, die Regel auszuführen, wenn die Datei „article.aspx“ angefordert wird.

<add input="{QUERY\_STRING}" pattern="(?:^|&amp;)id=([0-9]+)(?:&amp;|$)" /> – Diese Bedingung prüft, ob die Abfragezeichenfolge einen Parameter id enthält, der einen numerischen Wert hat. Der tatsächliche Wert wird in einem Bedingungsrückverweis erfasst. Beachten Sie, dass dieses Muster auch dann funktioniert, wenn in der Abfragezeichenfolge andere Parameter vorhanden sind.

<add input="{IDtoTitleMap:{C:1}}" pattern="(.+)" /> – Diese Bedingung prüft, ob der von der Rewrite-Zuordnung IDtoTitleMap zurückgegebene Wert keine leere Zeichenfolge ist. Die Bedingung verwendet den Rückverweis aus dem vorherigen Bedingungsmuster als Eingabe für die Rewrite-Zuordnung.

<action type="Redirect" url="article.aspx?title={C:1}" appendQueryString="False" redirectType="Permanent" /> – Dieses Element gibt an, dass das URL-Rewrite-Modul den Webclient zurück zur Datei „article.aspx“ umleiten muss, allerdings mit einem anderen Abfragezeichenfolgenparameter title, der einen Wert hat, der in der Rewrite-Zuordnung nachgeschlagen wurde.

Testen der Regel für die Abfragezeichenfolge

Um die Rewrite-Regel, die die Zuordnung „IDtoTitleMap“ verwendet, zu testen, öffnen Sie einen Webbrowser, und rufen Sie eine der folgenden URLs auf:

http://localhost/article.aspx?id=1. Diese Anforderung wird auf http://localhost/article.aspx?title=some-title-1. http://localhost/article.aspx?someparam=somevalue&id=2 umgeleitet. Diese Anforderung wird auf http://localhost/article.aspx?title=some-title-2 umgeleitet

Zusammenfassung

In dieser exemplarischen Vorgehensweise haben Sie gelernt, wie Sie Rewrite-Zuordnungen verwenden, um URL-Zuordnungen für Umschreib- und Umleitungsregeln zu definieren. Außerdem haben Sie gelernt, wie Sie Zuordnungen zum Ändern der Abfragezeichenfolgenparameter verwenden.

Rewrite-Zuordnungen ermöglichen es, die Anzahl der Rewrite-Regeln zu reduzieren, wenn die URLs für die Umschreibung oder Umleitung statisch sind und die Umschreibungslogik nicht mithilfe von Musterabgleichstechniken ausgedrückt werden kann.