最新消息:最新信息可以到系统基本设置里填写,如果不想要这一栏可以修改head.htm,将第53行到55行删除即可

基于Nginx 反向代理获取真实IP的问题详解

创意新鲜 dedesos.com

一、前语

前文nginx 处理webapi跨域二次恳求以及vue单页面问题 傍边尽管处理了跨域问题带来的二次恳求,但也产生了一个新的问题,便是假如需求获取用户ip的时分,获取的ip地址总是本机地址。

二、原因

因为nginx反向署理后,在运用中取得的ip都是反向署理服务器的ip,取得的域名也是反向署理装备的url的域名。

三、处理方案

处理该问题,需求在nginx反向署理装备中增加一些装备信息,意图将客户端的实在ip和域名传递到运用程序中。一起,也要修正获取ip地址的办法。

可是需求留意的是,经过nginx反向署理后,假如拜访ip经过了几层署理,或许取得的ip地址是这种格局:clientip,proxy1,proxy2。

假如需求将ip地址刺进到数据库的话,需求做避免注入。因而要对上述的ip地址的格局进行截取。

3.1 nginx 装备如下

server {
 listen 9461; # 监听端口号
 server_name localhost 192.168.88.22; # 拜访地址
 location / {
 root 项目途径; # 例如:e:/publish/xxx/;
 index index.html;
 # 此处用于处理 vue、angular、react 运用h5 的 history时 重写的问题
 if  {
 rewrite ^ /index.html last;
 break;
 # 署理服务端接口
 location /api {
 proxy_pass http://localhost:9460/api;# 署理接口地址
 # host装备以及域名传递
 proxy_set_header host $host;
 proxy_set_header x-real-ip $remote_addr;
 proxy_set_header remote-host $remote_addr;
 proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
 }

3.2 c#代码获取实在ip办法

#region ip
/// summary 
/// 客户端ip地址
/// /summary 
public static string ip
 var result = string.empty;
 if 
 result = getwebclientip;
 if )
 result = getlanip;
 return result;
/// summary 
/// 获取web客户端的ip
/// /summary 
/// returns /returns 
private static string getwebclientip
 var ip = getwebproxyrealip getwebremoteip;
 foreach )
 if 
 return hostaddress.tostring;
 return string.empty;
/// summary 
/// 获取web长途ip
/// /summary 
/// returns /returns 
private static string getwebremoteip
 return httpcontext.current.request.servervariables["http_x_forwarded_for"] 
 httpcontext.current.request.servervariables["remote_addr"] "";
 catch 
 return string.empty;
/// summary 
/// 获取web署理实在ip
/// /summary 
/// returns /returns 
private static string getwebproxyrealip
 var request = httpcontext.current.request;
 string ip = request.headers.get;
 if  || string.equals)
 ip = request.headers.get;
 if  || string.equals)
 ip = request.headers.get;
 if  || string.equals)
 ip = request.userhostaddress;
 if )
 return string.empty;
 // 或许存在如下格局:x-forwarded-for: client, proxy1, proxy2
 if )
 // 假如存在多个反向署理,取得的ip是一个用逗号分隔的ip调集,取第一个
 // x-forwarded-for: client 第一个
 string[] ips = ip.split;
 var i = 0;
 for 
 if 
 // 判别是否为内网ip
 if )
 ipaddress realip;
 if  && ips[i].split.length == 4)
 //合法ip
 return ips[i];
 return "";
 ip = ips[0];// 默许获取第一个ip地址
 return ip;
/// summary 
/// 判别ip地址是否为内网ip地址
/// /summary 
/// param name="ip" ip地址 /param 
/// returns /returns 
private static bool isinnerip
 bool isinnerip = false;
 ulong ipnum = ip2ulong;
 * 私有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这个网段是环回地址
 ulong abegin = ip2ulong;
 ulong aend = ip2ulong;
 ulong bbegin = ip2ulong;
 ulong bend = ip2ulong;
 ulong cbegin = ip2ulong;
 ulong cend = ip2ulong;
 isinnerip = isinner || isinner || isinner ||
 ip.equals;
 return isinnerip;
/// summary 
/// 将ip地址转换为long型数字
/// /summary 
/// param name="ip" ip地址 /param 
/// returns /returns 
private static ulong ip2ulong
 byte[] bytes = ipaddress.parse.getaddressbytes;
 ulong ret = 0;
 foreach 
 ret = 8;
 ret |= b;
 return ret;
/// summary 
/// 判别用户ip地址转换为long型后是否在内网ip地址地点规模
/// /summary 
/// param name="userip" 用户ip /param 
/// param name="begin" 开端规模 /param 
/// param name="end" 完毕规模 /param 
/// returns /returns 
private static bool isinner
 return  && ;
/// summary 
/// 获取局域网ip
/// /summary 
/// returns /returns 
private static string getlanip
 foreach ))
 if 
 return hostaddress.tostring;
 return string.empty;
#endregion

以上这篇根据nginx 反向署理获取实在ip的问题详解便是小编共享给我们的全部内容了,期望能给我们一个参阅,也期望我们多多支撑萬仟网。

    与本文相关的文章

    网友最新评论