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

时间:2014-07-20 23:25:07

标签: iis url-rewriting rewrite url-rewrite-module

我正在尝试将http://example.com/auth/recover?u=123&t=456重定向到http://example.com/#!/passwordreset/123/456

我的网址配置如下。

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

不幸的是,当重写发生时,我最终得到的网址如下:http://example.com/#!/resetpassword/u=123/123

如果我交换条件,我会发生类似的事情(我在URL中得到t = 456)。

1 个答案:

答案 0 :(得分:0)

我发现它不起作用的原因,以及解决方法,所以我将在这里回答我自己的答案。

似乎在IIS重写时使用条件时,只有LAST条件会传递给重定向操作。似乎{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>

所以它匹配我想要的第一个条件,然后将它传递给下一个条件,以便重新匹配&#34;再次与我的第二个参数。不是那么优雅,但它有效!