Verwenden von benutzerdefinierten Rewrite-Anbietern mit dem URL-Rewrite-Modul
von Ruslan Yakushev
In dieser exemplarischen Vorgehensweise erfahren Sie, wie Sie einen Rewrite-Anbieter für das URL-Rewrite-Modul 2.0 verwenden. In dieser exemplarischen Vorgehensweise kommen die URL Rewrite 2.0 Extensibility Samples zum Einsatz, die von „URL Rewrite Extensibility Samples“ in MSDN Code Gallery heruntergeladen werden können.
Installieren der URL Rewrite Extensibility Samples
Laden Sie für diese exemplarische Vorgehensweise die URL Rewrite Extensibility Samples (https://www.microsoft.com/download/details.aspx?id=43353
) herunter und installieren Sie sie. Das Installationspaket für die Extensibility Samples enthält .NET-Assemblys und den Quellcode mit vollständiger Implementierung von Rewrite-Anbietern für die drei am häufigsten verwendeten Anwendungsfälle:
- Speichern der Umschreib- oder Umleitungszuordnungen in einer SQL-Datenbank.
- Speichern der Umschreib- oder Umleitungszuordnungen in einer Textdatei.
- Speichern der Lookup-Substrings in einer Textdatei.
Achten Sie bei der Installation darauf, die Option „Runtime“ im benutzerdefinierten Setup auszuwählen. Dadurch werden die Beispielanbieter im globalen .NET-Assemblycache registriert, damit sie vom URL-Rewrite-Modul verwendet werden können.
Registrieren der Anbieter
Im Installationspaket sind drei Rewrite-Anbieter enthalten:
- DbProvider: Dieser Anbieter kann verwendet werden, um Umschreibzuordnungen aus einer SQL Server-Datenbanktabelle abzurufen, indem eine gespeicherte Prozedur ausgeführt wird.
- FileMapProvider: Dieser Anbieter kann verwendet werden, um in einer Textdatei gespeicherte Umschreibzuordnungen abzurufen.
- FileContainsProvider: Dieser Anbieter kann verwendet werden, um zu überprüfen, ob eine beliebige Zeichenfolge in einer Textdatei eine Teilzeichenfolge der Eingabezeichenfolge des Anbieters ist.
Damit die Beispielanbieter in den Umschreibregeln verwendet werden können, müssen die Anbieter in IIS registriert werden. Zum Registrieren eines Anbieters können Sie die IIS Manager-Benutzeroberfläche verwenden:
- Öffnen Sie das URL-Rewrite-Feature in IIS-Manager.
- Wählen Sie im Bereich „Aktionen“ auf der rechten Seite die Option „Anbieter anzeigen...“ aus.
- Wählen Sie im Bereich „Aktionen“ die Option „Anbieter hinzufügen...“ aus.
- Geben Sie im Dialogfeld „Anbieter hinzufügen“ den Namen ein, den Sie für diesen Anbieter verwenden möchten, wenn Sie von einer Umschreibregel darauf verweisen.
- Wählen Sie danach den entsprechenden .NET-Typ für den Anbieter in der Dropdownliste „Verwalteter Typ“ aus. Beachten Sie, dass es einige Zeit dauern kann, bis die Anbietertypen dort angezeigt werden.
- Wiederholen Sie die vorstehenden Schritte, um alle drei Anbieter zu registrieren.
Verwenden von DbProvider
Für die Verwendung von DbProvider benötigen Sie Zugriff auf Microsoft SQL Server. Der Anbieter stellt eine Verbindung mit einer SQL Server-Datenbank her und führt eine gespeicherte Prozedur aus, die einen NVARCHAR-Eingabeparameter verwendet, der die URL-Eingabezeichenfolge enthält. Anschließend gibt er einen einzeiligen, einspaltigen Ergebnissatz zurück, der die URL-Ausgabezeichenfolge vom Typ NVARCHAR enthält.
Erstellen einer Beispieldatenbank
Starten Sie SQL Server Management Studio, öffnen Sie ein neues Abfragefenster, und führen Sie das folgende SQL-Skript aus:
USE [master]
CREATE LOGIN [IIS APPPOOL\DefaultAppPool] FROM WINDOWS WITH DEFAULT_DATABASE=[master]
CREATE DATABASE [RewriteDB]
GO
USE [RewriteDB]
GO
CREATE TABLE [dbo].[RewriteTable](
[OriginalUrl] [nvarchar](256) NOT NULL,
[NewUrl] [nvarchar](256) NOT NULL
) ON [PRIMARY]
GO
CREATE PROCEDURE [dbo].[GetRewrittenUrl]
@input nvarchar(256)
AS
SELECT rt.NewUrl
FROM dbo.RewriteTable rt
WHERE rt.OriginalUrl = @input
GO
CREATE USER [IIS APPPOOL\DefaultAppPool] FOR LOGIN [IIS APPPOOL\DefaultAppPool]
GRANT EXECUTE ON dbo.GetRewrittenUrl TO [IIS APPPOOL\DefaultAppPool];
GO
INSERT INTO dbo.RewriteTable VALUES ('old/catalog/product.html', 'new/category/product.html');
INSERT INTO dbo.RewriteTable VALUES ('old/contactus/index.html', 'new/contactus.html');
GO
Das obige Skript erstellt eine neue Datenbank namens „RewriteDB“, die eine Tabelle „RewriteTable“ und eine gespeicherte Prozedur „GetRewrittenURL“ enthält. Außerdem gewährt es Berechtigungen für das Konto IIS APPPOOL\DefaultAppPool, um diese gespeicherte Prozedur auszuführen. Und es schreibt zwei URL-Zuordnungen in die Datenbanktabelle.
Konfigurieren der DbProvider-Einstellungen
Konfigurieren Sie die DbProvider-Instanz, um die gespeicherte Prozedur aufzurufen:
- Wählen Sie in IIS-Manager im Aktionsbereich der URL-Rewrite-Featureansicht die Option „Anbieter anzeigen...“ aus.
- Wählen Sie „Anbieter hinzufügen“ und dann DbProvider aus. Geben Sie als Name DB ein. Das ist der Name, mit dem Sie von einer Umschreibregel auf den Anbieter verweisen.
- Wählen Sie die DbProvider-Instanz DB aus, und klicken Sie auf die Aktion „Anbietereinstellung hinzufügen...“.
- Verwenden Sie das Dialogfeld „Anbietereinstellung bearbeiten“, um den Anbieter zu konfigurieren:
Konfigurieren Sie die folgenden Werte für die Anbietereinstellungen:
- SQL Server-Verbindungszeichenfolge: Geben Sie eine SQL Server-Verbindungszeichenfolge ein, Beispiel:
"Data Source=servername\sqlexpress;Initial Catalog=RewriteDB;Integrated Security=True" - Name der gespeicherten Prozedur: GetRewrittenUrl
- Cache-Minutenintervall: Auf 0 setzen, wenn sich die Werte in der SQL-Tabelle nicht ändern, oder auf eine positive ganze Zahl setzen, damit der Anbieter den internen Rewrite-Cache des Moduls regelmäßig aktualisiert. Wird nichts angegeben, wird der Wert 0 angenommen.
Aufrufen von DbProvider von einer Umschreibregel
Öffnen Sie im Stammverzeichnis einer Website die Datei web.config. Wenn Sie die IIS-Standardwebsite verwenden, sollte sich die Datei im Ordner C:\inetpub\wwwroot\
befinden.
Fügen Sie die folgende Umleitungsregel in die Datei „web.config“ im Element /<configuration>/<system.webServer>/<rewrite>/<rules>
ein:
<rule name="DbProviderTest" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{DB:{R:1}}" pattern="(.+)" />
</conditions>
<action type="Redirect" url="{C:1}" />
</rule>
Der vollständige Inhalt der Datei „web.config“ sollte wie folgt aussehen:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<providers>
<provider name="DB" type="DbProvider, Microsoft.Web.Iis.Rewrite.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<settings>
<add key="ConnectionString" value="Data Source=ruslany-server\sqlexpress;Initial Catalog=RewriteDB;Integrated Security=True" />
<add key="StoredProcedure" value="GetRewrittenUrl" />
<add key="CacheMinutesInterval" value="0" />
</settings>
</provider>
</providers>
<rules>
<rule name="DbProviderTest" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{DB:{R:1}}" pattern="(.+)" />
</conditions>
<action type="Redirect" url="{C:1}" />
</rule>
</rules>
</rewrite>
Diese Regel führt eine HTTP-Umleitung zu einer URL aus, die von einer SQL Server-Datenbank über DbProvider abgerufen wird. Die DbProvider-Instanz mit dem Namen „DB“ wird von der Regelbedingung aufgerufen. Wenn das vom Anbieter zurückgegebene Ergebnis nicht leer ist, wird die HTTP-Umleitung ausgeführt.
Um die Regel zu testen, öffnen Sie einen Webbrowser, und rufen Sie http://localhost/old/catalog/product.html
oder http://localhost/old/contactus/index.html
auf. Beachten Sie, dass der Browser basierend auf den in der Datenbanktabelle „RewriteDB“ definierten Umleitungszuordnungen zu einer neuen URL umgeleitet wird. Der Webserver gibt einen HTTP 404-Fehler für die umgeleitete URL zurück, da es keine solche Datei oder kein solches Verzeichnis auf dem Server gibt, aber das ist für die Zwecke dieser exemplarischen Vorgehensweise nicht relevant. Der wichtige Teil ist, dass der Webserver eine Umleitungsantwort basierend auf der Regel ausgegeben hat, die DbProvider verwendet hat.
Verwenden von FileMapProvider
FileMapProvider liest die URL-Zuordnungen aus einer Textdatei. Es kann anstelle der integrierten Umschreibzuordnungsfunktion verwendet werden, wenn die Umschreibzuordnungseinträge sehr groß sind und es daher nicht praktikabel ist, sie in einer „web.config“-Datei abzulegen.
Erstellen einer Beispielzuordnungsdatei
Erstellen Sie ein neues Verzeichnis namens App_Data im Stammverzeichnis Ihrer Website. Erstellen Sie in diesem Verzeichnis eine Textdatei namens redirectmappings.txt. Fügen Sie der Datei die folgenden Zeilen hinzu:
old/catalog/product.html, new/category/product.html
old/contactus/index.html, new/contactus.html
WARNUNG: Stellen Sie immer sicher, dass auf die Textdatei nicht direkt über das Web zugegriffen werden kann. Verwenden Sie das IIS-Anforderungsfiltermodul, oder legen Sie die Datei im Ordner „App_Data“ ab, um zu verhindern, dass HTTP-Clients direkt auf den Inhalt der Datei zugreifen.
Konfigurieren von FileMapProvider
Konfigurieren Sie den FileMapProvider, indem Sie die gleichen Schritte ausführen wie unter Konfigurieren von DbProvider beschrieben. Verwenden Sie diese Werte für die Anbietereinstellungen:
- FilePath: {DOCUMENT_ROOT}\App_Data\redirectmappings.txt (Beachten Sie die Verwendung von {DOCUMENT_ROOT} im Dateipfad. Dieser wird bei der Initialisierung des Anbieters durch den tatsächlichen Pfad ersetzt. Das ist nützlich, wenn Sie keinen absoluten Dateipfad in der „web.config“-Datei angeben möchten.)
- IgnoreCase: 1
- Trennzeichen: "," (Wenn nicht angegeben, wird das TAB-Symbol als Trennzeichen verwendet.)
Aufrufen von FileMapProvider aus einer Umschreibregel
Öffnen Sie im Stammverzeichnis einer Website die Datei web.config. Wenn Sie die IIS-Standardwebsite verwenden, sollte sich die Datei im Ordner C:\inetpub\wwwroot\
befinden.
Fügen Sie die folgende Umleitungsregel in die Datei „web.config“ im Element /<configuration>/<system.webServer>/<rewrite>/<rules>
ein:
<rule name="FileMapProviderTest" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{FileMap:{R:1}}" pattern="(.+)" />
</conditions>
<action type="Redirect" url="{C:1}" />
</rule>
Der vollständige Inhalt der Datei „web.config“ sollte wie folgt aussehen:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<providers>
<provider name="FileMap" type="FileMapProvider, Microsoft.Web.Iis.Rewrite.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<settings>
<add key="FilePath" value="{DOCUMENT_ROOT}\App_Data\redirectmappings.txt" />
<add key="IgnoreCase" value="1" />
<add key="Separator" value="," />
</settings>
</provider>
</providers>
<rules>
<rule name="FileMapProviderTest" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{FileMap:{R:1}}" pattern="(.+)" />
</conditions>
<action type="Redirect" url="{C:1}" />
</rule>
</rules>
</rewrite>
Diese Regel führt eine HTTP-Umleitung zu einer URL durch, die über FileMapProvider aus einer Textdatei bezogen wird. Die FileMapProvider-Instanz mit dem Namen „FileMap“ wird von der Regelbedingung aufgerufen. Wenn das vom Anbieter zurückgegebene Ergebnis nicht leer ist, wird die HTTP-Umleitung ausgeführt.
Um die Regel zu testen, öffnen Sie einen Webbrowser, und rufen Sie http://localhost/old/catalog/product.html
oder http://localhost/old/contactus/index.html
auf. Beachten Sie, dass der Browser basierend auf den in der Datei „redirectmappings.txt“ definierten Umleitungszuordnungen zu einer neuen URL umgeleitet wird. Der Webserver gibt einen HTTP 404-Fehler für die umgeleitete URL zurück, da es keine solche Datei oder kein solches Verzeichnis auf dem Server gibt, aber das ist für die Zwecke dieser exemplarischen Vorgehensweise nicht relevant. Der wichtige Teil ist, dass der Webserver eine Umleitungsantwort basierend auf der Regel ausgegeben hat, die FileMapProvider verwendet hat.
Verwenden von FileContainsProvider
FileContainsProvider liest Zeichenfolgen aus einer Textdatei und überprüft dann, ob die Eingabezeichenfolge des Anbieters eine dieser Zeichenfolgen als Teilzeichenfolge enthält. Der Anbieter kann zum Beispiel mit Umschreibregeln verwendet werden, die den Zugriff auf der Grundlage des Benutzer-Agent-Headers blockieren.
Erstellen einer Beispieldatei mit unzulässigen Benutzer-Agenten
Erstellen Sie ein neues Verzeichnis namens App_Data im Stammverzeichnis Ihrer Website. Erstellen Sie in diesem Verzeichnis eine Textdatei namens disalloweduseragents.txt. Fügen Sie der Datei die folgenden Zeilen hinzu:
badrobot1
badrobot2
WARNUNG: Stellen Sie immer sicher, dass auf die Textdatei nicht direkt über das Web zugegriffen werden kann. Verwenden Sie das IIS-Anforderungsfiltermodul, oder legen Sie die Datei im Ordner „App_Data“ ab, um zu verhindern, dass HTTP-Clients direkt auf den Inhalt der Datei zugreifen.
Konfigurieren von FileContainsProvider
Konfigurieren Sie den FileMapProvider, indem Sie die gleichen Schritte ausführen wie unter Konfigurieren von DbProvider beschrieben. Verwenden Sie diese Werte für die Anbietereinstellungen:
- FilePath: {DOCUMENT_ROOT}\App_Data\disalloweduseragents.txt (Beachten Sie die Verwendung von {DOCUMENT_ROOT} im Dateipfad. Dieser wird bei der Initialisierung des Anbieters durch den tatsächlichen Pfad ersetzt. Das ist nützlich, wenn Sie keinen absoluten Dateipfad in der „web.config“-Datei angeben möchten.)
- IgnoreCase: 1
Aufrufen von FileContainsProvider aus einer Umschreibregel
Öffnen Sie im Stammverzeichnis einer Website die Datei web.config. Wenn Sie die IIS-Standardwebsite verwenden, sollte sich die Datei im Ordner C:\inetpub\wwwroot\
befinden.
Fügen Sie die folgende Umleitungsregel in die Datei „web.config“ im Element /<configuration>/<system.webServer>/<rewrite>/<rules>
ein:
<rule name="FileContainsProviderTest" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{FileContains:{HTTP_USER_AGENT}}" pattern=".+" />
</conditions>
<action type="AbortRequest" />
</rule>
Der vollständige Inhalt der Datei „web.config“ sollte wie folgt aussehen:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<providers>
<provider name="FileContains" type="FileContainsProvider, Microsoft.Web.Iis.Rewrite.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<settings>
<add key="FilePath" value="{DOCUMENT_ROOT}\App_Data\disalloweduseragents.txt" />
<add key="IgnoreCase" value="1" />
</settings>
</provider>
</providers>
<rules>
<rule name="FileContainsProviderTest" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{FileContains:{HTTP_USER_AGENT}}" pattern=".+" />
</conditions>
<action type="AbortRequest" />
</rule>
</rules>
</rewrite>
Diese Regel bricht die HTTP-Verbindung ab, wenn der Benutzer-Agent der HTTP-Anforderung mit einer der in der Datei „disalloweduseragents.txt“ aufgeführten Zeichenfolgen übereinstimmt. Die FileContainsProvider-Instanz mit dem Namen „FileContains“ wird von der Regelbedingung aufgerufen. Wenn das vom Anbieter zurückgegebene Ergebnis nicht leer ist, wird die HTTP-Umleitung abgebrochen.
Um die Regel zu testen, öffnen Sie WFetch, und fügen Sie der Anforderung wie folgt einen Benutzer-Agent-Header hinzu:
user-agent: badrobot1\r\n
Rufen Sie von WFetch aus http://localhost/test/
auf. Die Verbindung sollte abgebrochen werden, da die Benutzer-Agent-Zeichenfolge einer der Zeichenfolgen in der Datei „disalloweduseragents.txt“ entspricht.