1

我的 web.config 中有以下代码

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="IP Correction">
                    <match url="(.*)" />
                    <serverVariables>
                        <set name="REMOTE_ADDR" value="{HTTP_X-Forwarded-For}"/>
                    </serverVariables>
                    <action type="None" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

这在我网站的根目录上完美运行,但是,在任何子文件夹中都没有触发该规则。

4

2 回答 2

2

我想通了。问题出在这行代码中

<action type="None" />

您必须指定重写操作

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="IP Correction">
                    <match url="(.*)" ignoreCase="true" />
                    <serverVariables>
                        <set name="REMOTE_ADDR" value="{HTTP_X-Forwarded-For}" replace="true"/>
                    </serverVariables>
                    <action type="Rewrite" url="{R:0}" appendQueryString="true" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>
于 2013-03-04T04:15:04.357 回答
2

我遇到了类似的问题并创建了一个 IHttpModule 来解决它,您可以在此处找到它。URL 重写似乎有一个错误,它不会在默认文档请求上执行。该模块没有这个问题。要在您的站点上实现它,您可以将它添加到<modules>web.config 的部分,或者如果您希望它在服务器范围内运行,则添加到您的 applicationHost.config。

相关的代码是您连接到 HttpApplication 的 BeginRequest 事件,并运行:

void OnBeginRequest(object sender, EventArgs e)
{
        HttpApplication app = (HttpApplication)sender;

        string headervalue = app.Context.Request.Headers["X-Forwarded-For"];

        if (headervalue != null)
        {
                Match m = REGEX_FIRST_IP.Match(headervalue);

                if (m.Success)
                {
                        app.Context.Request.ServerVariables["REMOTE_ADDR"] = m.Groups[1].Value;
                        app.Context.Request.ServerVariables["REMOTE_HOST"] = m.Groups[1].Value;
                }
        }
}

正则表达式是^\s*(\d+\.\d+\.\d+\.\d+). 完整的代码在要点

如果您将此代码编译到名为 HttpModules 的类库中并将其放入 GAC 中,则可以将其添加到您的<modules>部分,例如:

<add name="ClientIP" type="YourLibrary.ClientIP, YourLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=00DEADBEEF00" />

于 2017-03-10T03:32:17.123 回答