Перезапись URL-адреса IIS для захвата строк запроса

Я пытаюсь перенаправить http://example.com/auth/recover?u=123&t=456 на http://example.com/#!/passwordreset/123/456

Моя конфигурация URL выглядит так.

      <rewrite>
        <rules>
          <rule name="Redirect Forgotten Password" stopProcessing="true">
            <match url="^auth/recover" />
            <conditions>
              <add input="{QUERY_STRING}" pattern="u=([0-9]+)" />
              <add input="{QUERY_STRING}" pattern="t=([0-9]+)" />
            </conditions>
            <action type="Redirect" url="/#!/resetpassword/{C:0}/{C:1}" appendQueryString="false" />
          </rule>
        </rules>
      </rewrite>

К сожалению, когда происходит перезапись, я получаю URL-адрес, который выглядит так: http://example.com/#!/resetpassword/u=123/123

Если я поменяю местами условия, произойдет то же самое (я получу t=456 в URL-адресе).


person MindingData    schedule 20.07.2014    source источник


Ответы (1)


Я нашел причину, по которой это не работает, и способ обойти это, поэтому я собираюсь ответить на свой собственный ответ здесь.

Кажется, что при использовании условий в перезаписи IIS в действие перенаправления будет передано только ПОСЛЕДНЕЕ условие. Также кажется, что {C:0} будет соответствовать всему условию, а затем индексы после этого будут совпадающими выражениями в этом условии.

Один из способов — создать одно условие, которое будет соответствовать строке запроса в одном лоте. Но это означает, что ваши параметры в строке запроса должны быть в одном и том же порядке каждый раз.

Вместо этого я сделал следующее:

 <rewrite>
    <rules>
      <rule name="Redirect Forgotten Password" stopProcessing="true">
        <match url="^auth/recover" />
        <conditions>
          <add input="{QUERY_STRING}" pattern="u=([0-9]+)" />
          <add input="##{C:1}##_{QUERY_STRING}" pattern="##([^#]+)##_.*t=([0-9]+)" />
        </conditions>
        <action type="Redirect" url="/#!/resetpassword/{C:1}/{C:2}" appendQueryString="false" />
      </rule>
    </rules>
</rewrite>

Таким образом, он соответствует первому условию, которое я хочу, а затем передает его следующему условию для повторного сопоставления вместе с моим вторым параметром. Не так элегантно, но работает!

person MindingData    schedule 21.07.2014