IIS переписать, переписать карты и строки запроса

10

Пожалуйста, помогите мне понять, переписать карты, у меня есть эта настройка:

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

Вот мое правило:

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

Это работает, если я пытаюсь получить доступ к этим страницам:

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

Но я хочу добавить строку запроса на любую из этих страниц, например:

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

Когда я пытаюсь получить доступ к этой странице, я получаю 404. Как я могу заставить это работать?

Мартин
источник

Ответы:

12

По умолчанию правила перезаписи URL с использованием карт перезаписи создаются в соответствии с переменной {REQUEST_URI} . Это включает в себя URL + строку запроса. Это позволяет сопоставлять URL-адреса с параметрами строки запроса и перезаписывать их на другие страницы. Очень удобно, но это, очевидно, не то, что вы хотите / нужно.

Вы хотите сопоставить только с URL, без строки запроса. Чтобы изменить это, вы должны заменить {REQUEST_URI} в условии на {URL} . Тогда только URL (без строки запроса) будет сопоставлен с картой перезаписи. Затем вы можете добавить строку запроса к переписанному URL-адресу, чтобы исполняемый скрипт все еще имел к ней доступ.

Вы в конечном итоге с правилом, как:

<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
Отличное объяснение. Мне было интересно, как игнорировать QueryString для целей сопоставления.
dthrasher