Réécriture IIS, réécriture de cartes et de chaînes de requête

10

Veuillez m'aider à comprendre les cartes de réécriture, j'ai cette configuration:

<rewriteMap name="MyMap">
   <add key="/pages" value="/website/pages/index.aspx" />
   <add key="/pages/page-1" value="/website/pages/page-1/index.aspx" />
   <add key="/pages/page-1/section-1" value="/website/pages/page-1/section-1.aspx" />
</rewriteMap>

Voici ma règle:

<rule name="Rewrite rule for MyMap" stopProcessing="true">
   <match url=".*" />
   <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
      <add input="{MyMap:{REQUEST_URI}}" pattern="(.+)" />
   </conditions>
   <action type="Rewrite" url="{C:1}" appendQueryString="true" />
</rule>

Cela fonctionne si j'essaie d'accéder à ces pages:

  • www.mydomain.com/pages (OK)
  • www.mydomain.com/pages/page-1 (OK)
  • www.mydomain.com/pages/page-1/section-1 (OK)

Mais je veux la possibilité d'ajouter une chaîne de requête sur l'une de ces pages, exemple:

  • www.mydomain.com/pages?page=1 (FAIL)

Lorsque j'essaie d'accéder à cette page, j'obtiens un 404. Comment puis-je le faire fonctionner?

Martin
la source

Réponses:

12

Par défaut, les règles de réécriture d'URL utilisant des mappages de réécriture sont créées en faisant correspondre la variable {REQUEST_URI} . Cela inclut l'URL + la chaîne de requête. Cela vous permet de comparer des URL avec des paramètres de chaîne de requête et de les réécrire sur d'autres pages. Très pratique mais ce n'est apparemment pas ce que vous voulez / besoin.

Vous souhaitez uniquement faire correspondre l'URL, sans la chaîne de requête. Pour changer cela, vous devez remplacer {REQUEST_URI} dans la condition {URL} . Ensuite, seule l'URL (sans chaîne de requête) sera comparée à la carte de réécriture. Vous pouvez ensuite ajouter la chaîne de requête à l'URL réécrite afin que le script exécuté y ait toujours accès.

Vous vous retrouvez avec une règle comme:

<rule name="Rewrite rule for MyMap">
    <match url=".*" />
    <conditions>
        <add input="{MyMap:{URL}}" pattern="(.+)" />
    </conditions>
    <action type="Rewrite" url="{C:1}" appendQueryString="true" />
</rule>
Marco Miltenburg
la source
1
Grande explication. Je me demandais aussi comment ignorer la chaîne de requête à des fins de correspondance.
dthrasher