Utilisation de règles de réécriture globale et distribuée
par Ruslan Yakushev
Cette procédure pas à pas explique les différents types de règles pris en charge par le module de réécriture d’URL et vous guidera tout au long de la configuration des règles de réécriture globales et distribuées.
Background
Les règles de réécriture globale sont utilisées pour définir la logique de réécriture d’URL à l’échelle du serveur. Ces règles sont définies dans le fichier applicationHost.config et ne peuvent pas être remplacées ou désactivées sur des niveaux de configuration inférieurs, tels que le site ou le répertoire virtuel. Les règles globales fonctionnent toujours sur le chemin d’URL absolu (c’est-à-dire l’URI demandé sans le nom du serveur). Par exemple, si une requête a été adressée http://localhost/directory1/directory2/index.html
, le module de réécriture d’URL passe « directory1/directory2/index.html » comme entrée à une règle globale.
Les règles de réécriture distribuée sont utilisées pour définir une logique de réécriture d’URL spécifique à une étendue de configuration particulière. Les règles distribuées peuvent être définies sur n’importe quel niveau de configuration (sauf fichier) à l’aide de fichiers web.config. Les règles locales fonctionnent toujours sur les URL par rapport à l’emplacement du fichier Web.config où elles sont définies. Par exemple, si une requête a été adressée et http://localhost/directory1/directory2/index.html
qu’une règle de réécriture a été définie dans le fichier Web.config situé dans directory1, le module de réécriture d’URL transmet « directory2/index.html » comme entrée à cette règle.
L’ensemble de règles globaux est toujours évalué en premier, et une fois que ce jeu de règles distribués sera évalué à l’aide d’une chaîne d’URL produite par l’ensemble de règles global.
Prérequis
Cette procédure pas à pas nécessite les prérequis suivants :
- IIS 7.0 ou version ultérieure avec ASP.NET service de rôle activé
- Réécriture de l’URL version Go Live installée
Configuration d’un scénario de procédure pas à pas
Pour montrer comment utiliser des règles globales et locales, nous allons implémenter un scénario courant de mappage de sous-domaines aux répertoires. Cela nous permettra d’utiliser des sous-domaines pour accéder au contenu dans différents répertoires sur notre site. Par exemple, les utilisateurs pourront accéder à http://blog.mysite.com
au lieu de http://mysite.com/blog
, ou à http://forum.mysite.com
au lieu de http://mysite.com/forum
.
Pour configurer le scénario, procédez comme suit :
Créez deux dossiers appelés « blog » et « forum » dans le dossier
%SystemDrive%\inetpub\wwwroot\
.Copiez le code asp.net suivant et placez-le dans le dossier
%SystemDrive%\inetpub\wwwroot\blog
dans un fichier appelé article.aspx :<%@ 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>
Copiez le code asp.net suivant et placez-le dans le dossier
%SystemDrive%\inetpub\wwwroot\forum
dans un fichier appelé forum.aspx :<%@ 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>
Ouvrez le fichier appelé « hosts », situé à
%SystemDrive%\windows\system32\drivers\etc\
et ajoutez les deux lignes suivantes à l’emplacement suivant :127.0.0.1 forum_localhost 127.0.0.1 blog_localhost
Après avoir ajouté ces lignes, ouvrez un navigateur web et des fronts pour http://blog_localhost/blog/article.aspx et pour http://forum_localhost/forum/forum.aspx et vérifier que les pages ont été affichées correctement dans un navigateur.
Création d’une règle de réécriture globale
Tout d’abord, nous allons créer une règle de réécriture globale qui réécrit l’URL en fonction de l’en-tête de l’hôte. Par exemple, si la demande a été adressée à http://blog_localhost/article.aspx, la règle modifie le chemin d’URL en « /blog/article.aspx ».
Pour créer une règle globale à l’aide de l’interface utilisateur de réécriture d’URL dans le Gestionnaire d’IIS, procédez comme suit :
- Accéder au Gestionnaire des services Internet
- Dans l’arborescence de navigation, sélectionnez le nœud serveur.
- Dans l’affichage des fonctionnalités, cliquez sur « Module de réécriture d’URL »
- Dans le volet « Actions », cliquez sur « Ajouter des règles… »
- Dans la boîte de dialogue « Ajouter des règles », sélectionnez « Règle vide », puis cliquez sur « Ok » :
Nous devons maintenant définir la règle de réécriture réelle. Dans la règle de réécriture du module de réécriture d’URL, il est défini en spécifiant quatre éléments essentiels d’informations :
- Nom de la règle
- Modèle à utiliser pour la correspondance de la chaîne d’URL
- Ensemble facultatif de conditions
- Action à effectuer si le modèle a été mis en correspondance et toutes les vérifications de conditions ont réussi
Affectation d’un nom à une règle
Dans la zone de texte « Nom », entrez un nom qui identifie de manière unique la règle, par exemple : « Mappage de sous-domaine ».
Définition d’un modèle
Dans la zone de texte « Modèle », entrez la chaîne suivante :
(.*)
Cette chaîne est une expression régulière qui spécifie que le modèle correspond à n’importe quelle chaîne d’URL, y compris une chaîne vide et qu’elle capture la chaîne correspondante dans une référence back-reference.
Définition d’une condition
Cliquez sur le bouton « Ajouter des conditions » :
Cliquez sur le bouton Ajouter… pour afficher la boîte de dialogue pour définir des conditions.
Pour « Entrée de condition : » entrez cette chaîne : «{HTTP_HOST} ». Cela configure le module de réécriture d’URL pour utiliser la valeur de l’en-tête de l’hôte de requête HTTP comme entrée pour la condition
Dans la zone de liste déroulante, sélectionnez «Correspond au modèle».
Dans la zone de texte « Modèle », entrez «^([^_]+)_[^_]+». Cette expression régulière sera utilisée pour faire correspondre les domaines que nous avons créés (blog_localhost et forum_localhost) et capturera la partie de la chaîne avant « _ » dans une référence back-reference. Par exemple, pour la chaîne «blog_localhost», il conserve le «blog» dans la référence back-reference.
Une fois que toutes les propriétés ont été spécifiées, la boîte de dialogue condition doit se présenter comme suit :
Cliquez sur OK pour enregistrer la condition et revenir à l’interface utilisateur « Ajouter une règle ».
Définition d’une action
Étant donné que la règle que nous créons est censée réécrire l’URL, choisissez le type d’action « Réécrire » dans la zone de groupe « Action ». Dans la zone de texte « Réécrire l’URL : » entrez la chaîne suivante :
{C:1}/{R:1}
Cette chaîne spécifie l’URL d’entrée à réécrire. La référence back-reference à la condition {C :1} est utilisée comme nom du dossier, puis tout ce qui a été capturé dans le modèle de règle est conservé à l’aide de la référence back-reference à la règle {R :1}.
Laissez les valeurs par défaut pour tous les autres paramètres. L’interface utilisateur « Modifier la règle » doit ressembler à la page suivante :
Enregistrez la règle en cliquant sur l’action « Appliquer » sur le côté droit.
Pour comprendre comment cette règle sera appliquée, passons en revue les étapes effectuées par le module de réécriture d’URL lorsque le client HTTP demande cette URL :
http://blog_localhost/article.aspx?id=323
:
- Le module de réécriture d’URL passe « article.aspx ?id=323 » en tant qu’URL d’entrée à la règle, la correspond correctement au modèle de règle et la capture dans une référence back-reference {R :1}
- La valeur d’en-tête de l’hôte (« blog_localhost ») est correctement mise en correspondance avec l’expression régulière « ^([^_]+)_[^_]+ » et, par conséquent, « blog » est capturé dans une référence back-reference de condition {C :1}
- Conformément à la chaîne de substitution {C :1}/{R :1} l’URL est réécrite en « blog/article.aspx ?id=323 ».
Test de la règle
Pour tester que la règle réécrit correctement l’URL, ouvrez le navigateur Internet et demandez l’URL suivante :
http://blog_localhost/article.aspx?id=123
Vous devez voir que le module de réécriture d’URL a modifié l’URL et ouvert une page Article.aspx dans le répertoire « blog ». Les modifications apportées par le module de réécriture d’URL étaient basées sur les informations extraites de l’en-tête de l’hôte.
De même, lorsque vous demandez http://forum_localhost/forum.aspx?id=345
l’URL sera réécrite dans /forum/forum.aspx ?id=345.
Création de règles distribuées
La règle globale que nous venons de créer a été utilisée pour mapper la requête à un dossier en fonction des informations extraites de l’en-tête de l’hôte. Nous allons maintenant créer des règles distribuées qui nous permettront d’avoir des URL sans paramètres de chaîne de requête. Les règles distribuées prennent comme entrée l’URL, qui a déjà été modifiée par une règle globale et y effectuera des modifications supplémentaires. En particulier :
- Une règle de réécriture dans le dossier « blog » réécrira le chemin d’URL de « article/234/some-title » vers « article.aspx ?id=234&title=some-title »
- Une règle de réécriture dans le dossier « forum » réécrira le chemin d’URL de « topic/123/some-topic-title » en « forum.aspx ?topic=some-topic-title&id=123 »
Les règles locales peuvent être créées à l’aide du Gestionnaire IIS ou en modifiant des fichiers web.config. À des fins de démonstration, nous allons créer les règles en modifiant manuellement les fichiers web.config.
Pour créer des règles de réécriture distribuée :
Créez un fichier web.config vide dans
%SystemDrive%\inetpub\wwwroot\**blog**
dossier. Ouvrez-le dans l’éditeur de texte, puis collez le code XML suivant :<?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>
Créez un fichier web.config vide dans
%SystemDrive%\inetpub\wwwroot\**forum**
dossier. Ouvrez-le dans l’éditeur de texte, puis collez le code XML suivant :<?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>
Test des règles globales et distribuées
Pour tester que toutes les règles fonctionnent correctement ensemble, ouvrez un navigateur Web et effectuez une demande pour http://blog_localhost/article/234/some-title
. La réponse dans le navigateur doit indiquer que l’URL a d’abord été modifiée par une règle globale, puis a été modifiée par une règle distribuée.
De même, si vous demandez http://forum_localhost/topic/123/some-topic-title
, vous devez voir que le module de réécriture d’URL change la chaîne d’URL demandée en « /forum/forum.aspx ?topic=some-topic-title&id=123 »
Résumé
Dans ce tutoriel, vous avez implémenté un scénario de mappage de sous-domaine à l’aide d’une règle globale, puis utilisé des règles distribuées pour activer les URL conviviales des pages web dans ces dossiers.