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.

Contexte

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 applicationHost.config fichier 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é faite à http://localhost/directory1/directory2/index.html et 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 passe « directory2/index.html » comme entrée à cette règle.

L'ensemble de règles global est toujours évalué en premier, suivi par l'évaluation du jeu de règles distribué en utilisant une chaîne d'URL produite par l'ensemble de règles global.

Prerequisites

Cette procédure pas à pas nécessite les prérequis suivants :

  1. IIS 7.0 ou version ultérieure avec ASP.NET service de rôle activé
  2. 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 à la http://blog.mysite.com place de http://mysite.com/blog, ou à http://forum.mysite.com la place de http://mysite.com/forum.

Pour configurer le scénario, procédez comme suit :

  1. Créez deux dossiers appelés « blog » et « forum » dans %SystemDrive%\inetpub\wwwroot\ le dossier.

  2. Copiez le code asp.net suivant et placez-le dans le %SystemDrive%\inetpub\wwwroot\blog dossier 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>
    
  3. Copiez le code asp.net suivant et placez-le dans le %SystemDrive%\inetpub\wwwroot\forum dossier 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>
    
  4. Ouvrez le fichier appelé « hosts », situé à l’emplacement %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 naviguez vers http://blog_localhost/blog/article.aspx et http://forum_localhost/forum/forum.aspx, et vérifiez que les pages ont été rendues correctement.

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 requête a été effectuée vers 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 :

  1. Accéder au Gestionnaire des services Internet
  2. Dans l’arborescence de navigation, sélectionnez le nœud serveur.
  3. Dans l’affichage des fonctionnalités, cliquez sur « Module de réécriture d’URL »
    Capture d’écran de la page d'accueil de WIN deux K huit R T M. L’icône de réécriture d'URL est surlignée.
  4. Dans le volet « Actions », cliquez sur « Ajouter des règles... »
    Capture d’écran de la page Réécriture U R L. Dans le volet Actions, ajouter des règles est mis en surbrillance.
  5. Dans la boîte de dialogue « Ajouter des règles », sélectionnez « Règle vide », puis cliquez sur « Ok » :
    Capture d’écran de la boîte de dialogue Ajouter des règles. L’icône De règle vide est sélectionnée.

Nous devons maintenant définir la règle de réécriture réelle. Dans le module de réécriture d’URL, la règle de réécriture est définie en spécifiant quatre informations essentielles :

  • 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 » :

Capture d’écran de la page Modifier la règle. Dans la catégorie Conditions, l’option Ajouter des conditions est mise en surbrillance.

Cliquez sur « Ajouter... » pour afficher la boîte de dialogue pour définir des conditions.

Capture d’écran de la page Modifier la règle. Le bouton Ajouter dans la catégorie Conditions est mis en surbrillance.
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 « Pattern », entrez « ^([^_]+)_[^_]+ ». Cette expression régulière sera utilisée pour associer les domaines que nous avons créés (blog_localhost et forum_localhost) et extraira la partie de la chaîne avant le symbole « _ » pour la référencer ensuite. Par exemple, pour la chaîne « blog_localhost », elle conserve le « blog » dans la rétro-référence.

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 :

Capture d’écran de la boîte de dialogue Modifier la condition. Dans la zone d’entrée Condition, le crochet de texte H T T P trait de soulignement HOST est écrit. La case Ignorer la case est cochée.

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étro-référence à la condition {C:1} est utilisée pour nommer le dossier, puis tout ce qui a été capturé dans le modèle de règle est conservé en utilisant la rétro-référence à la règle {R:1}.

Conservez les valeurs par défaut pour tous les autres paramètres. L’interface utilisateur « Modifier la règle » doit ressembler à la page suivante :

Capture d’écran de la page Modifier la règle. Les colonnes Entrée, Type et Modèle ont tous du texte.

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 :

  1. Le module de réécriture d’URL passe « article.aspx?id=323 » en tant qu’URL d’entrée à la règle, la fait correspondre correctement au modèle de règle et la capture dans une représentation inverse {R:1}
  2. La valeur d’en-tête de l’hôte (« blog_localhost ») est bien mise en correspondance avec l’expression régulière « ^([^_]+)_[^_]+ » et, par conséquent, « blog » est capturé dans une référence de condition {C:1}
  3. 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

Capture d’écran de la page de test du module de réécriture U R L. Les informations sur la variable serveur et les informations valeur sont affichées.

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 :

  1. Créez un fichier web.config vide dans le %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}&amp;title={R:2}"/>
            </rule>
          </rules>
        </rewrite>
      </system.webServer>
    </configuration>
    
  2. Créez un fichier web.config vide dans le %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}&amp;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 à 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 ».

Capture d’écran de la page de test du module de réécriture U R L. La chaîne U R L a changé.

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.