1.前言Nginx解决WebApi跨域二次请求和Vue单页问题。虽然解决了跨域问题导致的二次请求,但是也产生了一个新的问题,就是如果需要获取用户IP,获取到的IP地址始终是本机地址。回到顶部2.原因是经过Nginx反向代理后,应用中获取到的IP是反向代理服务器的IP,获取到的域名也是反向代理配置的Url的域名。返回顶部3.解决方案要解决这个问题,需要在Nginx反向代理配置中添加一些配置信息,以便将客户端的真实IP和域名传递给应用程序。同时,获取IP地址的方式也必须进行修改。但是需要注意的是,经过Nginx反向代理后,如果访问IP经过几层代理,可能得到的IP地址是这样的格式:clientIP,proxy1,proxy2。如果需要将IP地址插入数据库,则需要进行防注入。所以应该截取上述IP地址的格式。3.1Nginx配置如下server{listen9461;#监听端口号server_namelocalhost192.168.88.22;#访问地址位置/{根项目路径;#例如:E:/Publish/xxx/;indexindex.html;#这里使用处理Vue、Angular、React使用H5的History重写问题/localhost:9460/api;#代理接口地址#主机配置和域名转移获取真实IP方法#regionIp(客户端IP地址)//////客户端IP地址///publicstaticstringIp{get{varresult=string.Empty;if(HttpContext.Current!=null){result=GetWebClientIp();}if(string.IsNullOrWhiteSpace(result)){result=GetLanIp();}returnresult;}}//////获取Web客户端的IP///摘要>///privatestaticstringGetWebClientIp(){varip=GetWebProxyRealIp()??GetWebRemoteIp();foreach(varhostAddressinDns.GetHostAddresses(ip)){if(hostAddresss.AddressFamily==AddressFamily.InterNetwork){returnhostAddress.ToString();}}returnstring.Empty;}//////获取Web远程IP//////privatestaticstringGetWebRemoteIp(){try{returnHttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]??HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]??"";}catch(Exceptione){returnstring.Empty;}}//////获取Web代理真实IP//////privatestaticstringGetWebProxyRealIp(){varrequest=HttpContext.Current.Request;stringip=request.Headers.Get("x-forwarded-for");if(string.IsNullOrEmpty(ip)||string.Equals("unknown",ip,StringComparison.OrdinalIgnoreCase)){ip=request.Headers.Get("代理客户端-IP");}if(string.IsNullOrEmpty(ip)||string.Equals("unknown",ip,StringComparison.OrdinalIgnoreCase)){ip=request.Headers.Get("WL-Proxy-Client-IP");}if(string.IsNullOrEmpty(ip)||string.Equals("unknown",ip,StringComparison.OrdinalIgnoreCase)){ip=request.UserHostAddress;}if(string.IsNullOrEmpty(ip)){returnstring.Empty;}//可能存在如下格式:X-Forwarded-For:client,proxy1,proxy2if(ip.Contains(",")){//如果有多个反向代理,获取的IP为逗号分隔的IP集合,take***one//X-Forwarded-For:client***string[]ips=ip.Split(newstring[1]{","},StringSplitOptions.RemoveEmptyEntries);vari=0;for(i=0;i///判断IP地址是否为内网IP地址//////IP地址///privatestaticboolIsInnerIp(stringip){boolisInnerIp=false;ulongipNum=Ip2Ulong(ip);/***私有IP*A类:10.0.0.0-10.255。255.255*B类:172.16.0.0-172.31.255.255*C类:192.168.0.0-192.168.255.255*当然还有127这个网段是环回地址*/ulongaBegin=Ip2Ulong("10.0.0.0");ulongaEnd=Ip2Ulong("10.255.255.255");ulongbBegin=Ip2Ulong("172.16.0.0");ulongbEnd=Ip2Ulong("10.31.255.255");ulongcBegin=Ip2Ulong("192.168.0.0");ulongcEnd=Ip2Ulong("192.168.255.255");isInnerIp=I,aBegin,aEnd)||IsInner(ipNum,bBegin,bEnd)||IsInner(ipNum,cBegin,cEnd)||ip.Equals("127.0.0.1");returnisInnerIp;}//////将IP地址转换为Long类型的数字//////IP地址///privatestaticulongIp2Ulong(stringip){byte[]bytes=IPAddress.Parse(ip).GetAddressBytes();ulongret=0;foreach(varbinbytes){ret<<=8;ret|=b;}returnret;}//////判断用户IP地址转换内网IP地址范围是否为Long//////用户IP///起始范围参数>///结束范围///privatestaticboolIsInner(ulonguserIp,ulongbegin,ulongend){return(userIp>=begin)&&(userIp<=end);}//////获取局域网IP//////privatestaticstringGetLanIp(){foreach(varhostAddressinDns.GetHostAddresses(Dns.GetHostName())){if(hostAddress.AddressFamily==AddressFamily.InterNetwork){returnhostAddress.ToString();}}returnstring.Empty;}#endregion