我的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>
这完全适用于我的网站的根目录,但是,规则不会在任何子文件夹中触发。
答案 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" />