隐藏

asp.net WebApi获取客户端IP地址(无视代理)nginx

发布:2022/10/19 17:42:19作者:管理员 来源:本站 浏览次数:1221

最近在开发小程序的时候,需要做一个功能,就是获取小程序当前提交请求的用户IP,因为公司服务器使用了Nginx,在网上百度了很多获取IP的的方法,很多方法虽然说无视代理,但是获取后的IP仍是Nginx的IP,最后通过寻找各种文档,最后找到了解决方案,特来分享一下。


asp.net wepapi单服务器获取当前访问用户IP(含网站、小程序等应用程序访问)。


     /// <summary>

           /// 获取客户端IP地址(无视代理)

           /// </summary>

           /// <returns>若失败则返回回送地址</returns>

           public static string GetHostAddress()

           {

               if (System.Web.HttpContext.Current == null || System.Web.HttpContext.Current.Request == null || System.Web.HttpContext.Current.Request.ServerVariables == null)

                   return "";

               string userHostAddress = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];

               if (string.IsNullOrEmpty(userHostAddress))

               {

                   if (System.Web.HttpContext.Current.Request.ServerVariables["HTTP_VIA"] != null)

                       userHostAddress = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString().Split(',')[0].Trim();

               }

               if (string.IsNullOrEmpty(userHostAddress))

               {

                   userHostAddress = HttpContext.Current.Request.UserHostAddress;

               }

   

               //最后判断获取是否成功,并检查IP地址的格式(检查其格式非常重要)

               if (!string.IsNullOrEmpty(userHostAddress) && IsIP(userHostAddress))

               {

                   return userHostAddress;

               }

               return "127.0.0.1";

           }

   

           /// <summary>

           /// 检查IP地址格式

           /// </summary>

           /// <param name="ip"></param>

           /// <returns></returns>

           public static bool IsIP(string ip)

           {

               return System.Text.RegularExpressions.Regex.IsMatch(ip, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$");

           }




asp.net wepapi 有Nginx情况下获取当前访问用户IP(含网站、小程序等应用程序访问)。


    /// <summary>

           /// 获取客户端IP地址(无视代理)

           /// </summary>

           /// <returns>若失败则返回回送地址</returns>

           public static string GetHostAddress()

           {

               string result = string.Empty;

               result = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

               if (result != null && result != string.Empty)

               {

                   //可能有代理  

                   if (result.IndexOf(".") == -1)    //没有"."肯定是非IPv4格式  

                       result = null;

                   else

                   {

                       if (result.IndexOf(",") != -1)

                       {

                           //有",",估计多个代理。取第一个不是内网的IP。  

                           result = result.Replace(" ", "").Replace("\"", "");

                           string[] temparyip = result.Split(",;".ToCharArray());

                           for (int i = 0; i < temparyip.Length; i++)

                           {

                               if (IsIP(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 (IsIP(result)) //代理即是IP格式  

                           return result;

                       else

                           result = null;    //代理中的内容 非IP,取IP  

                   }

               }

               string IpAddress = (HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null && HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != string.Empty) ? HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] : HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];

               if (null == result || result == string.Empty)

                   result = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];

               if (result == null || result == string.Empty)

                   result = HttpContext.Current.Request.UserHostAddress;

               return result;

           }

   

   

           /// <summary>

           /// 检查IP地址格式

           /// </summary>

           /// <param name="ip"></param>

           /// <returns></returns>

           public static bool IsIP(string ip)

           {

               return System.Text.RegularExpressions.Regex.IsMatch(ip, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$");

           }


知识要点:


可以通过x-forwarded-for获得转发后请求信息。当客户端请求被转发,IP将会追加在其后并以逗号隔开,例如:10.47.103.13,4.2.2.2,10.96.112.230。

请求中的参数:

request.getHeader("x-forwarded-for") : 10.47.103.13,4.2.2.2,10.96.112.230

request.getHeader("X-Real-IP") : 10.47.103.13

request.getRemoteAddr():10.96.112.230

客户端访问经过转发,IP将会追加在其后并以逗号隔开。最终准确的客户端信息为:

x-forwarded-for 不为空,则为逗号前第一个IP ;

X-Real-IP不为空,则为该IP ;

否则为getRemoteAddr() ;