我们用Request.ServerVariables( "REMOTE_ADDR ") 来取得客户端的IP地址,
但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的IP地址,而不是真正的客户端IP地址。
要想透过代理服务器取得客户端的真实IP地址,就要使用 Request.ServerVariables( "HTTP_X_FORWARDED_FOR ") 来读取。
不过要注意的事,并不是每个代理服务器都能用 Request.ServerVariables( "HTTP_X_FORWARDED_FOR ") 来读取客户端的真实IP,有些用此方法读取到的仍然是代理服务器的IP。
还有一点需要注意的是:如果客户端没有通过代理服务器来访问,那么用 Request.ServerVariables ( "HTTP_X_FORWARDED_FOR ") 取到的值将是空的。因此,如果要在程序中使用此方法,可以这样处理:
userip = Request.ServerVariables( "HTTP_X_FORWARDED_FOR ")
If userip = " " Then userip = Request.ServerVariables( "REMOTE_ADDR ") 即:如果客户端通过代理服务器,则取 HTTP_X_FORWARDED_FOR 的值,
/// <summary>
/// 获取IP地址
/// </summary>
/// <returns></returns>
public
static
string
getIPAddress()
{
string
result = String.Empty;
result = System.Web.HttpContext.Current.Request.ServerVariables[
"HTTP_X_FORWARDED_FOR"
];
// 如果使用代理,获取真实IP
if
(result !=
null
&& result.IndexOf(
"."
) == -1)
//没有“.”肯定是非IPv4格式
result =
null
;
else
if
(result !=
null
)
{
if
(result.IndexOf(
","
) != -1)
{
//有“,”,估计多个代理。取第一个不是内网的IP。
result = result.Replace(
" "
,
""
).Replace(
"'"
,
""
);
string
[] temparyip = result.Split(
",;"
.ToCharArray());
for
(
int
i = 0; i < temparyip.Length; i++)
{
if
(IsIPAddress(temparyip[i])
&& temparyip[i].Substring(0, 3) !=
"10."
&& temparyip[i].Substring(0, 7) !=
"192.168"
&& temparyip[i].Substring(0, 7) !=
"172.16."
)
{
return
temparyip[i];
//找到不是内网的地址
}
}
}
else
if
(IsIPAddress(result))
//代理即是IP格式
return
result;
else
result =
null
;
//代理中的内容 非IP,取IP
}
if
(
null
== result || result == String.Empty)
result = System.Web.HttpContext.Current.Request.ServerVariables[
"REMOTE_ADDR"
];
if
(result ==
null
|| result == String.Empty)
result = System.Web.HttpContext.Current.Request.UserHostAddress;
return
result;
}
/// <summary>
/// 判断是否是IP地址格式 0.0.0.0
/// </summary>
/// <param name="str1">待判断的IP地址</param>
/// <returns>true or false</returns>
private
static
bool
IsIPAddress(
string
str1)
{
if
(str1 ==
null
|| str1 ==
string
.Empty || str1.Length < 7 || str1.Length > 15)
return
false
;
string
regformat =
@"^\d{1,3}[\.]\d{1,3}[\.]\d{1,3}[\.]\d{1,3}$"
;
Regex regex =
new
Regex(regformat, RegexOptions.IgnoreCase);
return
regex.IsMatch(str1);
}
|
如果没通过代理服务器,就取 REMOTE_ADDR 的值。
转自http://www.cnblogs.com/huacw/archive/2012/03/15/2398524.html