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

Iis 7 IIS 7重写web.config serverVariables指令在子文件夹中不起作用,iis-7,web-config,rewrite,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="

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


这在我的网站的根目录上运行得很好,但是在任何子文件夹中都不会触发该规则。

我发现了这一点。问题出在这行代码中

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

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

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

void OnBeginRequest(对象发送方,事件参数e)
{
HttpApplication应用程序=(HttpApplication)发送方;
字符串headervalue=app.Context.Request.Headers[“X-Forwarded-For”];
if(headervalue!=null)
{
匹配m=正则表达式第一个IP匹配(headervalue);
如果(m.成功)
{
app.Context.Request.ServerVariables[“REMOTE_ADDR”]=m.Groups[1]。值;
app.Context.Request.ServerVariables[“REMOTE_HOST”]=m.Groups[1]。值;
}
}
}
正则表达式是
^\s*(\d+\.\d+\.\d+\.\d+)
。完整代码在

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


您不需要将操作设置为“重写”,因为您没有尝试重写URL。然而,URL重写有一个bug,它不会总是对默认文档执行。请参阅下面我的答案以了解解决方法。