我收集用户访问我网站的IP地址的统计信息,我注意到只有两个IP地址,172.16.16.1和172.16.16.248。我用来确定IP地址的属性是
Request.UserHostAddress
IP地址信息丢失的原因是什么?所有用户都来自世界各地,所以他们不能仅仅支持两个代理。
答案 0 :(得分:24)
你可能想要这样的东西;
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
答案 1 :(得分:9)
这看起来像是反向代理的工作。 当您使用反向代理时,客户端将连接到代理,代理本身会打开与服务器的新连接。由于ASP.NET使用传入连接的信息来填充用户地址,因此您将获得反向代理的地址。
如果您确实在此配置中,则需要来自反向代理的帮助才能获得正确的信息。大多数反向代理提供了使用客户端的真实IP地址向HTTP请求添加标头的可能性。查看代理的文档。
答案 2 :(得分:5)
在Dave Anderson的回答基础上,这里有一个片段,它考虑了一系列反向代理。
string forwardedFor = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
string ipStr = string.IsNullOrWhiteSpace(forwardedFor)
? Request.ServerVariables["REMOTE_ADDR"]
: forwardedFor.Split(',').Select(s => s.Trim()).First();
答案 3 :(得分:1)
我假设您支持NAT /反向代理,所以我认为您必须使用:
Request.ServerVariables("REMOTE_ADDR")
很可能172.16.0.0/12是您的私有LAN,其中172.16.16.248是您自己的地址,172.16.16.1是您的路由器/代理的地址。
答案 4 :(得分:1)
Request.ServerVariables(“REMOTE_ADDR”)不起作用。 这个问题是因为你的服务器可能在一些代理后面(或通过某些网络连接到互联网)或你的路由器设置被设置为NAT(网络地址转换)这种技术不会将ip传递给服务器。在这种情况下,你无法使用Asp.net获取IP地址 但是Java提供的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 :(得分:0)
您列出的两个地址来自定义为私有的其中一个范围。 (有关说明,请参阅here)
这听起来更像是你拿起自己防火墙的内部地址?
答案 6 :(得分: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);
}