Question

J'utilise Mod Rewrite pour IIS 7.0 depuis iis.net et je souhaite rediriger les demandes:

J'ai créé 2 règles:

<rule name="ID">
   <match url="/users/([0-9])" />
   <action type="Rewrite" url="/User.aspx?id={R:1}" />
</rule>
<rule name="Name">
   <match url="/users/([a-z])" ignoreCase="true" />
   <action type="Rewrite" url="/User.aspx?name={R:1}" />
</rule>

Il passe un test dans la boîte de dialogue de test iis mmc, mais pas dans le débogage (une URL comme http: // localhost: 9080 / example.com / users / 1 ou & # 8230; / users / foo ) et ne pas sur vrai IIS!

Qu'est-ce que j'ai mal fait?

Était-ce utile?

La solution

Le problème évident est que vos expressions rationnelles actuelles ne correspondent qu’à un caractère du nom d’utilisateur ou à un seul chiffre. Vous devrez ajouter un quantificateur plus à l'intérieur des parenthèses afin de faire correspondre plusieurs lettres ou chiffres. Voir cette page pour plus d'informations sur les quantificateurs de regex. Notez que vous ne correspondez pas à des URL simples telles que & Quot; / users / & Quot; (pas d'identifiant ni de nom). Assurez-vous que c'est ce que vous vouliez.

L’autre problème que vous rencontrez est que IIS évalue les règles de réécriture à partir du premier caractère après la barre oblique initiale. Ainsi, votre règle correspondant à /users/([0-9]) ne correspond à rien car, lorsque l'évaluation des regex est effectuée, l'URL ressemble à users/foo et non à /users/foo. La solution consiste à utiliser ^ (qui est le caractère regex qui signifie & "; Début de la chaîne &";) Au début du modèle, au lieu d'une barre oblique. Comme ceci:

<rule name="ID">
    <match url="^users/([0-9]+)" />
    <action type="Rewrite" url="/User.aspx?id={R:1}" />
</rule>
<rule name="Name">
    <match url="^users/([a-z]+)" ignoreCase="true" />
    <action type="Rewrite" url="/Users.aspx?name={R:1}" />
</rule>

Notez que vous choisissez Users.aspx pour l'une de ces URL et User.aspx (aucun pluriel) pour l'autre. Assurez-vous que c'est ce que vous vouliez.

BTW, la façon dont j'ai compris ces choses-là était en utilisant Le suivi des demandes ayant échoué IIS pour résoudre les problèmes de réécriture des règles . Cela a rendu le diagnostic très facile. J'ai pu faire une demande de test et parcourir la trace pour trouver où chaque règle de réécriture est évaluée (c'est dans une section de la trace appelée & "PATTERN_MATCH &"). Pour le PATTERN_MATCH particulier pour l'un des tes règles, j'ai vu ceci:

  

-PATTERN_MATCH
  Motif / utilisateurs / ([0-9] +?)
  Utilisateurs InputURL / 1
  Nier faux
  Matched false

Notez l'absence de la barre oblique de début.

Autres conseils

Vous devez utiliser <match url="/users/([0-9]+)" /> et <match url="/users/([a-z]+)" ignoreCase="true" />, respectivement, pour faire correspondre l'identifiant / utilisateur complet et pas seulement leur première lettre / chiffre. Mais je ne sais pas pourquoi votre expression rationnelle aurait échoué avec un seul chiffre, il doit donc y avoir un autre problème.

En ce qui concerne votre deuxième question, je ne suis pas sûr de bien comprendre. Comment pouvez-vous faire la différence entre un nom de dossier et un nom d'utilisateur? Un dossier aura-t-il toujours une barre oblique finale?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top