首页 > 解决方案 > 用 IIS 重定向映射替换特定的查询字符串值

问题描述

我正在尝试为 .NET Core 项目创建一个重定向规则,该规则将替换查询字符串值,以帮助在某些标识符上部署迁移。例如网址:

http://www.somesite.com/page.html?somevar=abc&id=1234&othervar=cde

应该重定向到

http://www.somesite.com/page.html?somevar=abc&id=b64540a6-b12d-443f-973f-673e4451ccbe&othervar=cde

在重写文件中,我创建了一个重写映射,如下所示:

<rewriteMaps>
    <rewriteMap name="newIdentifierMap">
      <add key="1234" value="b64540a6-b12d-443f-973f-673e4451ccbe" />
    </rewriteMap>
</rewriteMaps>

但现在我在创建使用此地图的规则时遇到了一些麻烦。这就是我正在做的...

<rule>
  <match url=".*" />
  <conditions>
    <add input="{newIdentifierMap:REQUEST_URI}" pattern="(.*)id=([0-9]+)(.*)" />
  </conditions>
  <action type="Redirect" url="" RedirectType="Permanent" />
</rule>

现在我被阻止了,不知道如何准确地替换地图中的值。谢谢你的帮助!

解决方案

在检查了@abraham-qian 提供的答案后,我能够通过应用以下规则来解决问题:

<rule>
  <match url="(.*)" />
  <conditions>
    <add input="{QUERY_STRING}" pattern="(.*)(\bid=([0-9]+))(.*)" />
  </conditions>
  <action type="Redirect" url="{R:0}?{C:1}id={newIdentifierMap:{C:3}}{C:4}" RedirectType="Permanent" appendQueryString="false" />
</rule>

<rewriteMaps>
    <rewriteMap name="newIdentifierMap">
      <add key="1234" value="b64540a6-b12d-443f-973f-673e4451ccbe" />
    </rewriteMap>
</rewriteMaps>

这似乎适用于查询字符串中 id 变量之前或之后的任意数量的变量。

标签: asp.net-coreredirectiisurl-rewriting

解决方案


为了匹配 ID 段,我们可以使用{Query_String}服务器变量。
请参考下面的代码片段,

    <rewrite>
      <rules>
        <rule name="MyRules" stopProcessing="true">
          <match url="(.*)" />
          <conditions>
                        <add input="{QUERY_STRING}" pattern="(.*)(\bid=([0-9]+))(.*)" />
          </conditions>
<!--{C:3} is the value of id, it is referred by the above condition.-->
          <action type="Redirect" url="Https://vabqia969vm:448/{MyMap:{C:3}}" appendQueryString="false" />
        </rule>
      </rules>
      <rewriteMaps>
        <rewriteMap name="MyMapName" defaultValue="">
          <add key="1234" value="HtmlPage1.html"></add>
        </rewriteMap>
      </rewriteMaps>
</rewrite>

但是,存在一个问题,我们应该取消选中该选项Append Query String,否则将导致无限循环,因为附加的查询字符串满足条件。我们必须一一匹配每个查询字段。像这样,

(somevar=.*)&(\bid=([0-9]+))&(othervar=.*)

我们最好根据您的情况修改规则。
如果有什么我可以帮忙的,请随时告诉我。


推荐阅读