2008-10-14 45 views
9

我收集用户访问我的网站的IP地址统计信息,我注意到只有两个IP地址172.16.16.1和172.16.16.248。我用来确定IP地址的属性是UserHostAddress给出错误的IP

Request.UserHostAddress 

什么可能是IP地址信息丢失的原因?所有的用户都来自世界各地,所以他们不能落后于两个代理。

回答

9

这看起来像是一个反向代理的工作。 当您使用反向代理时,客户端连接到代理,代理本身会打开到您的服务器的新连接。由于ASP.NET使用传入连接的信息来填充用户地址,因此您将获得反向代理的地址。

如果您的确在使用此配置,您需要从反向代理获得帮助以获取正确的信息。大多数反向代理提供了向HTTP请求添加头部以及客户端的真实IP地址的可能性。检查你的代理文件。

1

我假设你是后面的NAT /反向代理,所以我认为你必须使用:

Request.ServerVariables("REMOTE_ADDR") 

最有可能的是172.16.0.0/12您普里瓦局域网里的172.16.16.248是你自己的地址和172.16 .16.1你的路由器/代理的地址。

+0

你没有意思/ 16? – leppie 2008-10-14 10:14:21

+0

不能,/ 12应该是正确的默认值。 =) http://en.wikipedia。org/wiki/Private_network – Node 2008-10-14 10:21:32

0

您列出的两个地址来自被定义为私人的范围之一。 (看here的描述)

这听起来更像是你拿起自己的防火墙的内部地址?

23

你可能想要这样的东西;

string SourceIP = String.IsNullOrEmpty(Request.ServerVariables["HTTP_X_FORWARDED_FOR"]) ? Request.ServerVariables["REMOTE_ADDR"] : Request.ServerVariables["HTTP_X_FORWARDED_FOR"].Split(",")[0]; 

HTTP_X_FORWARDED_FOR标头获取代理服务器后面的IP地址。

看到此页面,解释为什么更详细; Getting The Real IP of your Users

+0

我知道HTTP_X_FORWARDED_FOR标题,但我对这个问题的原因更感兴趣。不管怎么说,还是要谢谢你! – 2008-10-15 05:20:15

1

Request.ServerVariables(“REMOTE_ADDR”)不起作用。 这个问题是因为你的服务器可能在一些代理服务器后面(或者通过某个网络连接到互联网)或者你的路由器设置被设置为NAT(网络地址转换)这种技术不会将ip传递给服务器。在这种情况下,你无法使用Asp.net获得IP地址 然而Java Provide applet使用它可以在任何情况下获得IP地址。

(适用于Netscape,Mozilla和Firefox只,而Java必须启用)

<script language="javascript" type="text/javascript"> 

if (navigator.appName.indexOf("Netscape") != -1){ 
ip = "" + java.net.InetAddress.getLocalHost().getHostAddress(); 
document.write("<b>Your IP address is " + ip+'</b>'); 
} 
else { 
document.write("<b>IP Address only shown in Netscape with Java enabled!</b>"); 
} 

</script> 
5

大厦戴夫·安德森的回答,这里是一个片段,考虑到反向代理链。

string forwardedFor = Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 

string ipStr = string.IsNullOrWhiteSpace(forwardedFor) 
        ? Request.ServerVariables["REMOTE_ADDR"] 
        : forwardedFor.Split(',').Select(s => s.Trim()).First(); 
0

大厦tomfannings回答...

public static string ClientIp(this HttpRequestBase @this) { 
    var clientIp = string.Empty; 
    string forwardedFor = @this.ServerVariables["HTTP_X_FORWARDED_FOR"]; 

    if (string.IsNullOrWhiteSpace(forwardedFor)) { 
    clientIp = @this.ServerVariables["REMOTE_ADDR"]; 
    } else { 

    var array = forwardedFor 
     .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) 
     .Select(s => s.Trim()); 

    foreach (var element in array) { 
     if (element.IsValidIp4() || element.IsValidIp6()) { 
     clientIp = element; 
     break; 
     } 
    } 
    } 
    return clientIp; 
} 

public static bool IsValidIp4(this string @this) { 
    var pattern = new Regex(@"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$"); 
    return pattern.IsMatch(@this); 
} 

public static bool IsValidIp6(this string @this) { 
    var pattern = new Regex(@"^s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:)))(%.+)?s*(\/(d|dd|1[0-1]d|12[0-8]))$"); 
    return pattern.IsMatch(@this); 
}