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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.