IIS Riscrivi, riscrivi mappe e stringhe di query


10

Per favore aiutami a capire riscrivere le mappe, ho questa configurazione:

<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>

Ecco la mia regola:

<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>

Funziona se provo ad accedere a queste pagine:

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

Ma voglio la possibilità di aggiungere una stringa di query su una di queste pagine, ad esempio:

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

Quando provo ad accedere a questa pagina, ottengo un 404. Come posso farlo funzionare?

Risposte:


12

Per impostazione predefinita, le regole di riscrittura degli URL che utilizzano le mappe di riscrittura vengono create corrispondenti alla variabile {REQUEST_URI} . Ciò include l'URL + la stringa di query. Ciò consente di confrontare gli URL con i parametri della stringa di query e riscriverli su altre pagine. Molto utile, ma a quanto pare non è quello che vuoi / hai bisogno.

Si desidera eseguire la corrispondenza solo con l'URL, senza la stringa di query. Per modificarlo devi sostituire {REQUEST_URI} nella condizione in {URL} . Quindi solo l'URL (senza stringa di query) verrà confrontato con la mappa di riscrittura. È quindi possibile aggiungere la stringa di query all'URL riscritto in modo che lo script eseguito abbia ancora accesso ad esso.

Si finisce con una regola come:

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

1
Ottima spiegazione Mi stavo chiedendo come ignorare la QueryString anche ai fini della partita.
Dthrasher,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.