nginx反向代理后,在应用中取得的ip都是反向代理服务器的ip,取得的域名也是反向代理配置的url的域名,解决该问题,需要在nginx反向代理配置中添加一些配置信息,目的将客户端的真实ip和域名传递到应用程序中。
nginx反向代理配置时,一般会添加下面的配置:
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;
其中第一行关于host的配置,是关于域名传递的配置,余下跟IP相关。
先看下C#代码的处理:
#region 获取反向代理时的客户端的IP地址 getClientIP /// <summary> /// 获取反向代理时的客户端的IP地址 /// </summary> /// <returns>返回客户端真实IP</returns> private string getClientIP() { HttpRequestBase request = HttpContext.Request; string ip = request.Headers.Get("x-forwarded-for"); if (ip == null || ip.Length == 0 || string.Equals("unknown", ip, StringComparison.OrdinalIgnoreCase)) { ip = request.Headers.Get("Proxy-Client-IP"); } if (ip == null || ip.Length == 0 || string.Equals("unknown", ip, StringComparison.OrdinalIgnoreCase)) { ip = request.Headers.Get("WL-Proxy-Client-IP"); } if (ip == null || ip.Length == 0 || string.Equals("unknown", ip, StringComparison.OrdinalIgnoreCase)) { ip = request.UserHostAddress; } return ip; }
但是需要注意的是,通过nginx反向代理后,如果访问IP通过了几层代理,可能取得的IP地址是这种格式:clientIP, proxy1, proxy2 .又可能需要进行插入数据库的话,防止数据库恶意注入。所以要针对上述IP地址的格式进行截取。
#region 获取反向代理时的客户端的IP地址 getClientIP /// <summary> /// 获取反向代理时的客户端的IP地址 /// </summary> /// <returns>返回客户端真实IP</returns> private string getClientIP() { HttpRequestBase request = HttpContext.Request; string ip = request.Headers.Get("x-forwarded-for"); if (ip == null || ip.Length == 0 || string.Equals("unknown", ip, StringComparison.OrdinalIgnoreCase)) { ip = request.Headers.Get("Proxy-Client-IP"); } if (ip == null || ip.Length == 0 || string.Equals("unknown", ip, StringComparison.OrdinalIgnoreCase)) { ip = request.Headers.Get("WL-Proxy-Client-IP"); } if (ip == null || ip.Length == 0 || string.Equals("unknown", ip, StringComparison.OrdinalIgnoreCase)) { ip = request.UserHostAddress; } //可能存在如下格式:X-Forwarded-For: client, proxy1, proxy2 int i = 0; if(ip.Contains(", ")) { //如果存在多个反向代理,获得的IP是一个用逗号分隔的IP集合,取第一个 //X-Forwarded-For: client 第一个 string[] ipaddrs = ip.Split(new string[1] { ", " },StringSplitOptions.RemoveEmptyEntries); for(i=0;i<ipaddrs.Length;i++) { if(ipaddrs[i]!="") { if (false == IsInnerIP(ipaddrs[i]))//判断是否为内网IP { IPAddress realip; if (IPAddress.TryParse(ipaddrs[i], out realip) && ipaddrs[i].Split('.').Length == 4) {//合法IP return ipaddrs[i]; } else {//非法IP //IP地址不符合规范 } } } } ip = ipaddrs[0];//默认取第一个ip地址 } return ip; } #endregion
之前发现,虽然说截取了上述IP地址的第一个clientip,但是发现有时候读出来的这个ip地址为内网IP。所以要加上内网IP的判断。
#region 判断IP地址是否为局域网内网地址 /// <summary> /// 判断IP地址是否为内网IP地址 /// </summary> /// <param name="ipAddress">IP地址字符串</param> /// <returns></returns> private bool IsInnerIP(String ipAddress) { bool isInnerIp = false; ulong ipNum = ip2ulong(ipAddress); /** 私有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("10.0.0.0"); ulong aEnd = ip2ulong("10.255.255.255"); ulong bBegin = ip2ulong("172.16.0.0"); ulong bEnd = ip2ulong("172.31.255.255"); ulong cBegin = ip2ulong("192.168.0.0"); ulong cEnd = ip2ulong("192.168.255.255"); isInnerIp = IsInner(ipNum, aBegin, aEnd) || IsInner(ipNum, bBegin, bEnd) || IsInner(ipNum, cBegin, cEnd) || ipAddress.Equals("127.0.0.1"); return isInnerIp; } /// <summary> /// 把IP地址转换为Long型数字 /// </summary> /// <param name="ipAddress">IP地址字符串</param> /// <returns></returns> private ulong ip2ulong(string ipAddress) { byte[] bytes = IPAddress.Parse(ipAddress).GetAddressBytes(); ulong ret = 0; foreach (byte b in bytes) { ret <<= 8; ret |= b; } return ret; } /// <summary> /// 判断用户IP地址转换为Long型后是否在内网IP地址所在范围 /// </summary> /// <param name="userIp"></param> /// <param name="begin"></param> /// <param name="end"></param> /// <returns></returns> private bool IsInner(ulong userIp, ulong begin, ulong end) { return (userIp >= begin) && (userIp <= end); } #endregion
后面又发现,nginx反向代理,得到的IP地址格式是unknown, 86.15.56.29。然后继续做处理。
if (ip.Contains(", ")) { //如果存在多个反向代理,获得的IP是一个用逗号分隔的IP集合,取第一个 //X-Forwarded-For: client 第一个 string[] ipaddrs = ip.Split(new string[1] { ", " }, StringSplitOptions.RemoveEmptyEntries); ip = ipaddrs[0];//先默认取第一个IP地址 foreach(string ipaddr in ipaddrs) { if (ipaddr != "" && ipaddr.Split('.').Length == 4 && string.Equals("unknown",ipaddr,StringComparison.OrdinalIgnoreCase) == false) {//对应一些特殊的获取的特殊IP地址结构 unknown, 86.15.56.29 if (false == IsInnerIP(ipaddr)) { IPAddress realip; if (IPAddress.TryParse(ipaddr, out realip)) {//合法IP ip = ipaddr; break;//只要找到一个非内网的IP地址,则跳出循环 } else {//非法IP LogHelper.writeLog(LogHelper.IP_THREAD_LOG + "_" + mApp, string.Format("非法IP地址为:\n{0}",ipaddr)); } } } } }
综合上述的得到IP地址,可以发现,其实并不能完全的到真实的IP地址。因为IP地址是可以伪造的。所以大家可以通过这种方式取得。但是一定要做一些特殊的判断及其处理,防止插入到数据库中,引起异常现象。
http://www.cnblogs.com/nx520zj/p/6031337.html
相关推荐
### Nginx反向代理不能访问项目的解决办法 在配置Nginx作为反向代理服务器时,有时会遇到可以通过域名正常访问Linux系统下部署的Tomcat服务器,但是却无法访问到部署在Tomcat上的具体项目的情况。这种情况通常是...
本文将详细介绍Nginx如何实现正向代理和反向代理,以及这两种代理方式的应用场景。 **正向代理** 正向代理的主要作用是让内部网络中的设备(如服务器B)通过一个具有外部网络访问权限的设备(如服务器A)来访问...
在IT行业中,HTTPS通信是确保网站数据安全传输的重要手段,而Nginx作为一款高性能的HTTP和反向代理服务器,常被用来实现这种安全通信。本文将深入探讨如何通过Nginx配置HTTPS服务器,实现443端口的反向代理,以及与...
在实际应用中,我们可以根据需要调整反向代理转发规则,例如根据用户的IP地址、浏览器类型等信息来进行转发。同时,我们也可以使用其他技术,例如负载均衡器、CDN 等来实现反向代理转发功能。 使用 Web APP 实现...
### Windows 下配置 Nginx 反向代理 Tomcat 在 Windows 环境下配置 Nginx 作为 Tomcat 的反向代理服务器是一项常见的任务,主要用于实现负载均衡、提高安全性及提升性能等目的。本文将从下载 Nginx 开始,详细介绍...
在反向代理模式下,Nginx接收到的请求头部信息可能包含多个IP地址,而我们通常需要的是原始客户端(用户)的IP地址,即真实IP。 要获取Nginx反向代理下的真实IP,主要涉及以下两个关键配置: 1. **$remote_addr ...
同一ip(都是80端口)可以绑定无数个域名 配置简单 里面包含一个配置文档:配置文档.doc 看一遍 大部分人都会设置了。 内容如下: NGNIX配置文档 1.解压文件到相应文件夹下(我解压到D:/下) (这里是图片) 目录...
【Nginx反向代理服务】是网络服务器配置中的一个重要概念,主要应用于负载均衡和安全性增强。Nginx是一款高性能的HTTP和反向代理服务器,以其高效、稳定和低内存占用而闻名。在Linux系统中部署Nginx,可以极大地提升...
在传统的正向代理中,用户通过代理服务器访问目标网站,代理服务器隐藏了真实用户的IP地址。而在反向代理中,情况正好相反,用户直接访问的是Nginx服务器,Nginx作为代理服务器隐藏了后端服务器的信息,将请求转发到...
在这个配置示例中,我们有四台 CentOS 7 虚拟机,其中一台作为 Nginx 代理服务器,IP 地址为 192.168.4.5 和 192.168.2.5,另外两台作为后端 Web 服务器,IP 地址分别为 192.168.2.100 和 192.168.2.200。...
Nginx 反向代理是指在服务器端将客户端的请求转发给内部网络的服务器,以隐藏内部服务器的 IP 地址,提高安全性和灵活性。下面是 Nginx 反向代理操作方法的详细步骤: 1. 首先,访问 Nginx 官网...
基于 Nginx 的反向代理可视化管理系统能够简化配置过程,提高管理效率,解决公网 IPv4 资源紧缺条件下对外发布多个 Web 应用的问题,为数字化校园建设过程中的公网 IP 地址紧缺问题提供了一种可行的解决方案。
-----> 代理目标地址, 需要在HOSTS文件中与之匹配。 #location ~ /(public|template) { # proxy_pass_header Server; # proxy_set_header Host $http_host; # proxy...
**Nginx反向代理 Linux版** 在现代Web服务架构中,Nginx是一个非常流行的高性能HTTP和反向代理服务器,尤其在Linux环境下,它的高效性能和轻量级特性使其成为首选。Nginx反向代理是其核心功能之一,能够帮助优化...
nginx反向代理配置文件,域名映射ip+端口,地址栏输入域名即可跳转对应的IP+端口
**一、Nginx反向代理原理** 反向代理是指客户端请求到达Nginx服务器时,Nginx并不直接返回内容,而是根据配置将请求转发到实际的后端服务器,获取内容后再返回给客户端。这样做的好处包括负载均衡、安全防护以及提高...
【Nginx反向代理】是网络服务器架构中一种重要的技术,主要用于实现用户访问数据的调度和压力分担,从而提升系统的性能、可伸缩性和高可用性。Nginx作为一个高性能的HTTP和反向代理服务器,常被用于构建集群环境,...