IIS 7重写web.config serverVariables指令在子文件夹中不起作用

时间:2013-03-03 18:52:41

标签: iis-7 web-config rewrite

我的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>

这完全适用于我的网站的根目录,但是,规则不会在任何子文件夹中触发。

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

我遇到了类似的问题并创建了一个IHttpModule来解决它,你可以find here。 URL Rewrite似乎有一个错误,它不会在默认文档请求上执行。该模块没有这个问题。要在您的网站上实施它,您可以将其添加到web.config的<modules>部分,或者如果您希望它在服务器范围内运行,则添加到您的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+)。完整代码位于the gist

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

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