Utilisation de fournisseurs de réécriture personnalisés avec le module de réécriture d’URL
par Ruslan Yakushev
Cette procédure pas à pas vous guide tout au long de l’utilisation de fournisseurs de réécriture personnalisés avec le module de réécriture d’URL 2.0. La procédure pas à pas utilise les exemples d’extensibilité de réécriture d’URL 2.0, qui peuvent être téléchargés à partir d’exemples d’extensibilité de réécriture d’URL dans MSDN Code Gallery.
Exemples d’extensibilité de réécriture d’URL
Pour effectuer cette procédure pas à pas, téléchargez et installez les exemples d’extensibilité de réécriture d’URL (https://www.microsoft.com/download/details.aspx?id=43353
). Le package d’installation des exemples d’extensibilité inclut des assemblys .NET et le code source avec une implémentation complète des fournisseurs de réécriture pour les trois cas d’usage les plus courants :
- Stockage des mappages de réécriture ou de redirection dans une base de données SQL ;
- Stockage des mappages de réécriture ou de redirection dans un fichier texte ;
- Stockage des substring de recherche dans un fichier texte.
Pendant l’installation, veillez à sélectionner l’option « Runtime » dans l’installation personnalisée. Cela permet d’inscrire les exemples de fournisseurs dans .NET Global Assembly Cache afin qu’ils puissent être utilisés par le module de réécriture d’URL.
Inscription des fournisseurs
Il existe 3 fournisseurs de réécriture inclus dans le package d’installation :
- DbProvider : ce fournisseur peut être utilisé pour récupérer des mappages de réécriture à partir d’une table de base de données SQL Server en exécutant une procédure stockée
- FileMapProvider : ce fournisseur peut être utilisé pour récupérer des mappages de réécriture stockés dans un fichier texte
- FileContainsProvider : ce fournisseur peut être utilisé pour vérifier si une chaîne dans un fichier texte est une substring de la chaîne d’entrée du fournisseur.
Pour utiliser les exemples de fournisseurs dans les règles de réécriture, les fournisseurs doivent être inscrits auprès d’IIS. Pour inscrire un fournisseur, vous pouvez utiliser l’interface utilisateur du Gestionnaire d’IIS :
- Ouvrir la fonctionnalité de réécriture d’URL dans le Gestionnaire d’IIS ;
- Sélectionnez « Afficher les fournisseurs... » action dans le volet « Actions » sur le côté droit ;
- Sélectionnez l’option « Ajouter un fournisseur... » action dans le volet « Actions » ;
- Dans la boîte de dialogue « Ajouter un fournisseur », entrez le nom que vous souhaitez utiliser pour ce fournisseur lors de sa référence à partir d’une règle de réécriture.
- Après avoir choisi le type .NET correspondant pour le fournisseur dans la liste déroulante « Type managé ». Notez qu’il peut prendre un certain temps pour que les types de fournisseurs apparaissent là-bas.
- Répétez les étapes ci-dessus pour inscrire les trois fournisseurs.
Utilisation de DbProvider
Pour utiliser DbProvider, vous devez accéder à Microsoft SQL Server. Le fournisseur se connecte à une base de données SQL Server et exécute une procédure stockée qui accepte un paramètre d’entrée NVARCHAR contenant la chaîne d’URL d’entrée et retourne une ligne, un jeu de résultats de colonne contenant la chaîne d’URL de sortie du type NVARCHAR.
Création d’un exemple de base de données
Ouvrez SQL Server Management Studio, ouvrez une nouvelle fenêtre de requête et exécutez le script SQL suivant :
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
Le script ci-dessus crée une base de données appelée RewriteDB, qui a une table RewriteTable et une procédure stockée GetRewrittenURL. Il accorde également des autorisations au compte IIS APPPOOL\DefaultAppPool pour exécuter cette procédure stockée. Il remplit également la table de base de données avec deux mappages d’URL.
Configuration des paramètres DbProvider
Configurez l’instance DbProvider pour appeler la procédure stockée :
- Dans le Gestionnaire IIS, dans l’affichage des fonctionnalités de réécriture d’URL, sélectionnez « Afficher les fournisseurs ... » dans le volet d'action.
- Sélectionnez « Ajouter un fournisseur » et choisissez DbProvider. Nommez-la base de données(DB); qui sera le nom par lequel vous allez faire référence au fournisseur à partir d’une règle de réécriture
- Sélectionnez l’instance DbProvider appelée DB(Base de données), puis cliquez sur l’action « Ajouter un paramètre de fournisseur ... ».
- Utilisez la boîte de dialogue « Modifier le paramètre du fournisseur » pour configurer le fournisseur :
Utilisez les valeurs suivantes pour les paramètres du fournisseur :
- Chaîne de connexion SQL Server: fournissez une chaîne de connexion SQL Server, par exemple :
« Data Source=servername\sqlexpress ; Initial Catalog=RewriteDB ; Integrated Security=True » - Nom de procédure stockée: GetRewrittenUrl
- Intervalle de minutes du cache: défini sur 0 si les valeurs de la table SQL ne changent pas ou définissent sur un entier positif afin que le fournisseur actualise régulièrement le cache de réécriture interne du module. Si la valeur 0 n’est pas spécifiée, elle est supposée.
Appel de DbProvider à partir d’une règle de réécriture
Dans le répertoire racine d’un site web, ouvrez fichier web.config. Si vous utilisez le site web par défaut IIS, le fichier doit se trouver dans le dossier C:\inetpub\wwwroot\
.
Collez la règle de redirection suivante dans le fichier web.config à l’intérieur de l’élément /<configuration>/<system.webServer>/<rewrite>/<rules>
:
<rule name="DbProviderTest" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{DB:{R:1}}" pattern="(.+)" />
</conditions>
<action type="Redirect" url="{C:1}" />
</rule>
Le contenu complet du fichier web.config doit ressembler à ce qui suit :
<?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>
Cette règle effectue une redirection HTTP vers une URL obtenue à partir d’une base de données SQL Server via DbProvider. L’instance DbProvider nommée « DB » est appelée à partir de la condition de la règle et si le résultat retourné par le fournisseur n’est pas vide, la redirection HTTP est effectuée.
Pour tester la règle, ouvrez un navigateur web et effectuez une demande pour http://localhost/old/catalog/product.html
ou http://localhost/old/contactus/index.html
. Notez que le navigateur est redirigé vers une nouvelle URL en fonction des mappages de redirection définis dans la table de base de données RewriteDB. Le serveur web retourne une erreur HTTP 404 pour l’URL redirigée, car il n’existe aucun fichier ou répertoire sur le serveur, mais cela n’est pas pertinent pour les besoins de cette procédure pas à pas. La partie importante est que le serveur web a émis une réponse de redirection en fonction de la règle qui a utilisé DbProvider.
Utilisation de FileMapProvider
FileMapProvider lit les mappages d’URL à partir d’un fichier texte. Il peut être utilisé au lieu de la fonctionnalité de réécriture intégrée des cartes lorsque la quantité d’entrées de carte de réécriture est très volumineuse et qu’il n’est pas pratique de les conserver dans un fichier web.config.
Création d’un fichier de mappages d’exemples
Créez un répertoire appelé App_Data dans le répertoire racine de votre site web. Dans ce répertoire, créez un fichier texte appelé redirectmappings.txt. Ajoutez les lignes suivantes au fichier :
old/catalog/product.html, new/category/product.html
old/contactus/index.html, new/contactus.html
AVERTISSEMENT: Vérifiez toujours que le fichier texte n’est pas directement accessible à partir du web. Utilisez le module de filtrage des requêtes IIS ou placez le fichier dans App_Data dossier pour empêcher les clients HTTP d’accéder directement au contenu de ce fichier.
Configuration de FileMapProvider
Configurez FileMapProvider en suivant les mêmes étapes que celles décrites dans Configuration de DbProvider. Utilisez ces valeurs pour les paramètres du fournisseur :
- FilePath: {DOCUMENT_ROOT}\App_Data\redirectmappings.txt (notez l’utilisation de {DOCUMENT_ROOT} dans le chemin du fichier. Cela est remplacé par le chemin d’accès réel lors de l’initialisation du fournisseur. Cela est utile lorsque vous ne souhaitez pas placer un chemin d’accès de fichier absolu dans le fichier web.config)
- IgnoreCase: 1
- Séparateur: « », (s’il n’est pas spécifié, le symbole TAB sera utilisé comme séparateur)
Appel de FileMapProvider à partir d’une règle de réécriture
Dans le répertoire racine d’un site web, ouvrez fichier web.config. Si vous utilisez le site web par défaut IIS, le fichier doit se trouver dans le dossier C:\inetpub\wwwroot\
.
Collez la règle de redirection suivante dans le fichier web.config à l’intérieur de l’élément /<configuration>/<system.webServer>/<rewrite>/<rules>
:
<rule name="FileMapProviderTest" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{FileMap:{R:1}}" pattern="(.+)" />
</conditions>
<action type="Redirect" url="{C:1}" />
</rule>
Le contenu complet du fichier web.config doit ressembler à ce qui suit :
<?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>
Cette règle effectue une redirection HTTP vers une URL obtenue à partir d’un fichier texte via FileMapProvider. L’instance FileMapProvider nommée « FileMap » est appelée à partir de la condition de la règle et si le résultat retourné par le fournisseur n’est pas vide, la redirection HTTP est effectuée.
Pour tester la règle, ouvrez un navigateur web et effectuez une demande pour http://localhost/old/catalog/product.html
ou http://localhost/old/contactus/index.html
. Notez que le navigateur est redirigé vers une nouvelle URL en fonction des mappages de redirection définis dans le fichier redirectmappings.txt. Le serveur web retourne une erreur HTTP 404 pour l’URL redirigée, car il n’existe aucun fichier ou répertoire sur le serveur, mais cela n’est pas pertinent pour les besoins de cette procédure pas à pas. Le composant important est que le serveur web a émis une réponse de redirection basée sur la règle qui a utilisé FileMapProviders.
Utilisation de FileContainsProvider
FileContainsProvider lit l’ensemble de chaînes à partir d’un fichier texte, puis vérifie si la chaîne d’entrée du fournisseur contient l’une de ces chaînes en tant que substring. Le fournisseur peut être utilisé par exemple avec des règles de réécriture qui bloquent l’accès en fonction de l’en-tête de l’agent utilisateur.
Création d’un exemple de fichier d’agents utilisateur non autorisé
Créez un répertoire appelé App_Data dans le répertoire racine de votre site web. Dans ce répertoire, créez un fichier texte appelé disalloweduseragents.txt. Ajoutez les lignes suivantes au fichier :
badrobot1
badrobot2
AVERTISSEMENT: Vérifiez toujours que le fichier texte n’est pas directement accessible à partir du web. Utilisez le module de filtrage des requêtes IIS ou placez le fichier dans App_Data dossier pour empêcher les clients HTTP d’accéder directement au contenu de ce fichier.
Configuration de FileContainsProvider
Configurez FileMapProvider en suivant les mêmes étapes que celles décrites dans Configuration de DbProvider. Utilisez ces valeurs pour les paramètres du fournisseur :
- FilePath: {DOCUMENT_ROOT}\App_Data\disalloweduseragents.txt (notez l’utilisation de {DOCUMENT_ROOT} dans le chemin du fichier. Cela est remplacé par le chemin d’accès réel lors de l’initialisation du fournisseur. Cela est utile lorsque vous ne souhaitez pas placer un chemin d’accès de fichier absolu dans le fichier web.config)
- IgnoreCase: 1
Appel de FileContainsProvider à partir d’une règle de réécriture
Dans le répertoire racine d’un site web, ouvrez fichier web.config. Si vous utilisez le site web par défaut IIS, le fichier doit se trouver dans le dossier C:\inetpub\wwwroot\
.
Collez la règle de redirection suivante dans le fichier web.config à l’intérieur de l’élément /<configuration>/<system.webServer>/<rewrite>/<rules>
:
<rule name="FileContainsProviderTest" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{FileContains:{HTTP_USER_AGENT}}" pattern=".+" />
</conditions>
<action type="AbortRequest" />
</rule>
Le contenu complet du fichier web.config doit ressembler à ce qui suit :
<?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>
Cette règle abandonne la connexion HTTP si l’agent utilisateur de la requête HTTP correspond à l’une des chaînes répertoriées dans disalloweduseragents.txt fichier. L’instance FileContainsProvider nommée « FileContains » est appelée à partir de la condition de la règle et si le résultat retourné par le fournisseur n’est pas vide, la connexion HTTP est abandonnée.
Pour tester la règle, ouvrez WFetch et ajoutez un en-tête d’agent utilisateur à la demande comme suit :
user-agent: badrobot1\r\n
À partir de WFetch, effectuez une requête pour http://localhost/test/
. Vous devez voir que la connexion est abandonnée, car la chaîne de l’agent utilisateur a mis en correspondance l’une des chaînes dans disalloweduseragents.txt fichier.