IIS URLRewrite - 操作URL中的多个条件返回引用

时间:2017-12-04 20:56:52

标签: iis url-rewriting

尝试使用URLRewrite设置一些重定向但保留一些(并且只保留源UR中的一些查询字符串参数,但遇到一些问题。

基本上我需要保留Google Analytics UTM参数并将其移至操作网址。这是配置部分或我的重定向之一:

        <rule name="Anything Else" patternSyntax="ECMAScript" stopProcessing="true">
            <match url=".*" />
            <conditions logicalGrouping="MatchAny" trackAllCaptures="true">
                <add input="{QUERY_STRING}" pattern="utm_source=(\w+)" />
                <add input="{QUERY_STRING}" pattern="utm_medium=(\w+)" />
                <add input="{QUERY_STRING}" pattern="utm_campaign=(\w+)" />
                <add input="{QUERY_STRING}" pattern="utm_term=(\w+)" />
                <add input="{QUERY_STRING}" pattern="utm_content=(\w+)" />
                <add input="{QUERY_STRING}" pattern=".*" />
            </conditions>
            <action type="Redirect" url="https://www.google.com?utm_source={C:1}&amp;utm_medium={C:2}" appendQueryString="false" redirectType="Temporary" />
        </rule>

查询字符串可能包含无,一个或所有UTM参数,但在任何情况下我都需要这些规则,只要原始URL匹配即可。为此,我们将LogicalGrouping设置为MatchAny,最终条件为完整的通配符。单独测试条件为我提供了返回参考{C:1}到{C:5}的UTM参数,虽然源URL中没有匹配的参数,或者不超过一个,但规则有效。

当我在源URL中有多个匹配条件时,会出现问题。 IIS抛出500错误&#34;表达式&#34; https://www.google.com? {C:2}&#34;无法扩展。&#34;

我是在叫错树吗?这甚至可能吗?我可以选择编写HTTPHandler并将转换交给那里,但我希望在不向服务器引入自定义代码的情况下这样做。

1 个答案:

答案 0 :(得分:1)

在规则操作中,您可以使用对该规则的最后匹配条件的反向引用。同样在条件输入字符串中,您可以使用对先前匹配条件的反向引用。

牢记这一点,一种可能的方法是在下一个条件的输入中使用上一个条件的后向引用:

<conditions>
    <add input="{QUERY_STRING}" pattern="(?:^|&amp;)var1=([1-9]\d+)(?:&amp;|$)" />
    <add input="%{C:1}%_{QUERY_STRING}" pattern="%(.+)%_.*var2=([1-9]\d+)(?:&|$)" />
</conditions>

然后规则的动作将如下所示:

<action type="Redirect" url="newpage.aspx/{C:1}/{C:2}" appendQueryString="false" redirectType="Permanent" />