public static string GetIP()
{
string result = String.Empty;
result = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (string.IsNullOrEmpty(result))
{
result = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}
if (string.IsNullOrEmpty(result))
{
result = HttpContext.Current.Request.UserHostAddress;
}
if (string.IsNullOrEmpty(result) || !Regex.IsMatch(result,
@"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$"))
{
return "127.0.0.1";
}
return result;
}
public static string GetIP()
{
string result = String.Empty;
result = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 如果有代理,返回代理服务器报告的原始ip(而不是代理主机的ip)
if (string.IsNullOrEmpty(result))
{
result = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 返回主机ip
}
if (string.IsNullOrEmpty(result))
{
result = HttpContext.Current.Request.UserHostAddress; 这一步实际上多余,UserHostAddress就是remote_addr
}
if (string.IsNullOrEmpty(result) || !Regex.IsMatch(result,
@"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$")) 如果没有ip,比如说内网回环,那么返回127.0.0.1是对的,但是如果是ipv6 ip,这么返回是不对的。总之,这样写简单粗暴且欠考虑。
{
return "127.0.0.1";
}
return result;
}
就是获取IP的方法。判断了3次,如果前面3个方法都没有的话或者结果不符合IP地址规则的话,最终返回127.0.0.1.
这段代码是错误!
因为正则表达式匹配时,没有考虑IPv6.