IIS URL重写以捕获查询字符串

IIS URL重写以捕获查询字符串,iis,url-rewriting,rewrite,url-rewrite-module,Iis,Url Rewriting,Rewrite,Url Rewrite Module,我正在尝试重定向到 我的URL配置看起来像 <rewrite> <rules> <rule name="Redirect Forgotten Password" stopProcessing="true"> <match url="^auth/recover" /> <conditions> <add inp

我正在尝试重定向到

我的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中得到一个t=456)

我已经找到了它不起作用的原因,以及解决它的方法,所以我将在这里回答我自己的答案

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

因此,它匹配我想要的第一个条件,然后将其传递到下一个条件,与我的第二个参数一起再次“重新匹配”。没有那么优雅,但它很管用