IIS Url使用捕获组重写列表中的第一个项目

时间:2014-12-15 22:04:13

标签: regex iis url-rewriting iis-7

我们的应用程序取决于各种功能的客户端IP地址。我们更新了基础架构,并改变了我们对应用程序负载平衡的方式。由于更改,报告给应用程序的CGI.REMOTE_ADDR是静态负载均衡器IP而不是客户端IP。为了解决这个问题,LB支持人员说要为LB和IIS添加规则。 LB现在配置为使用客户端ip发送标头[http_x_forwarded_for]。

IIS中的重写规则如下所示:

                <rule name="REMOTE_ADDR rewrite" enabled="true" patternSyntax="ECMAScript">
                <match url="^((?!GetImage).)*$" />
                <serverVariables>
                    <set name="REMOTE_ADDR" value="{HTTP_X_FORWARDED_FOR}" />
                </serverVariables>
                <action type="Rewrite" url="{R:0}" appendQueryString="true" logRewrittenUrl="false" />
            </rule>
            <rule name="REMOTE_ADDR blank URL rewrite" enabled="true">
                <match url="^$" />
                <serverVariables>
                    <set name="REMOTE_ADDR" value="{HTTP_X_FORWARDED_FOR}" />
                </serverVariables>
                <action type="Rewrite" url="default.cfm" />
            </rule>

第一条规则适用于除GetImage页面之外的任何页面。第二个是没有页面。

在大多数情况下,这是正常的。我们没有必要对应用程序进行任何调整,因为CGI.REMOTE_ADDR是正确的。

但我们被告知,在某些情况下,LB可能会传递多个IP地址并仅使用列表中的第一个IP地址。这导致了一个问题。

在某些情况下,CGI.REMOTE_ADDR就像这样'100.200.200.200,123,123,123,123'。

使用该字符串在IIS中测试RegEx,显示组{R:0}为100.200.200.200,123,123,123,123。

问题是是否可以编写规则以便{R:0}是列表中第一个匹配的IP地址?

1 个答案:

答案 0 :(得分:1)

在我发布之后意识到我正在以错误的方式攻击它(或者问......)。 URL规则正则表达式匹配URL以应用规则。所有匹配的URL都会将http_x_forwarded_for标头值映射到REMOTE_ADDR服务器变量中。这个变量的值可能是无效的问题。

要解决此问题,需要添加新的OUTBOUND规则。在此规则中,您可以将REMOTE_ADDR指定为INPUT并与正则表达式进行匹配以重写它。通过添加规则,正则表达式匹配变量中找到的第一个IP地址,然后用后面的跟踪重写变量,我就能解决问题。

            <outboundRules>
            <rule name="Format IP Address">
                <match serverVariable="REMOTE_ADDR" pattern="^([0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3})(.)*$" />
                <action type="Rewrite" value="{R;1}" />
            </rule>
        </outboundRules>