IIS URL重写正则规则需求:提取编码后RecId并生成目标重定向URL
解决IIS中URL重写提取编码后ID的问题
当然可以实现!首先咱们先明确编码规则:你提到的31333535对应实际ID1355,看得出来是每个实际数字前面都加了一个固定的"3"——比如1变成31,3变成33,以此类推。基于这个规则,我们可以通过正则配合IIS URL重写的功能来完成转换。
步骤1:匹配并捕获编码后的ID参数
首先,我们需要在IIS重写规则的条件中,精准捕获rq_RecId后面的编码值。可以用这个正则来匹配查询字符串:
.*rq_RecId=((?:3[0-9])+).*
((?:3[0-9])+):这部分是核心捕获组,(?:3[0-9])匹配一个"3"+数字的组合(非捕获组,避免多余分组),+表示匹配至少一个这样的组合,刚好对应编码后的ID(比如31333535)。
步骤2:转换编码值为实际ID
捕获到编码值后,我们需要把每个"3X"替换成"X"。IIS URL重写支持在替换字符串中使用.NET正则替换函数,直接对捕获的编码值做转换:
/doc/{REGEX::Replace({C:1}, '3([0-9])', '$1')}
{C:1}:引用第一步捕获到的编码后ID值;REGEX::Replace(...):调用正则替换,把每一个"3"后面跟着的数字单独提取出来($1就是匹配到的数字),最终把31333535转换成1355。
完整的IIS重写规则示例
把这些整合到web.config的重写规则里,大概是这样:
<rewrite> <rules> <rule name="Redirect Encoded RecId to Doc URL" stopProcessing="true"> <match url="^default\.asp$" /> <conditions logicalGrouping="MatchAll"> <add input="{QUERY_STRING}" pattern=".*rq_RecId=((?:3[0-9])+).*" /> </conditions> <action type="Redirect" url="/doc/{REGEX::Replace({C:1}, '3([0-9])', '$1')}" redirectType="Permanent" /> </rule> </rules> </rewrite>
额外说明
- 因为你提到实际ID范围是1-9999,所以编码后的长度会是2-8位(每个数字对应两位编码),上面的正则已经覆盖了这种情况;
- 如果URL中还有其他参数,这个规则不会影响,只要
rq_RecId存在就会触发重定向; redirectType="Permanent"是301永久重定向,如果你需要临时重定向,可以改成Temporary。
内容的提问来源于stack exchange,提问作者Philipp Hungerbühler
相关产品推荐
相关产品推荐

