Nginx中怎么利用反向代理获取真实IP
发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,今天就跟大家聊聊有关Nginx中怎么利用反向代理获取真实IP,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、前言前文 Nginx 解决Web
千家信息网最后更新 2025年12月01日Nginx中怎么利用反向代理获取真实IP
今天就跟大家聊聊有关Nginx中怎么利用反向代理获取真实IP,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
一、前言
前文 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 (!-e $request_filename) { 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(客户端IP地址) ////// 客户端IP地址 /// public static string Ip { get { var result = string.Empty; if (HttpContext.Current != null) { result = GetWebClientIp(); } if (string.IsNullOrWhiteSpace(result)) { result = GetLanIp(); } return result; } } ////// 获取Web客户端的IP /// ///private static string GetWebClientIp() { var ip = GetWebProxyRealIp() ?? GetWebRemoteIp(); foreach (var hostAddress in Dns.GetHostAddresses(ip)) { if (hostAddress.AddressFamily == AddressFamily.InterNetwork) { return hostAddress.ToString(); } } return string.Empty; } /// /// 获取Web远程IP /// ///private static string GetWebRemoteIp() { try { return HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] ?? HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"] ?? ""; } catch (Exception e) { return string.Empty; } } /// /// 获取Web代理真实IP /// ///private static string GetWebProxyRealIp() { var request = HttpContext.Current.Request; string ip = request.Headers.Get("x-forwarded-for"); if (string.IsNullOrEmpty(ip) || string.Equals("unknown", ip, StringComparison.OrdinalIgnoreCase)) { ip = request.Headers.Get("Proxy-Client-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)) { return string.Empty; } // 可能存在如下格式:X-Forwarded-For: client, proxy1, proxy2 if (ip.Contains(", ")) { // 如果存在多个反向代理,获得的IP是一个用逗号分隔的IP集合,取***个 // X-Forwarded-For: client ***个 string[] ips = ip.Split(new string[1] {", "}, StringSplitOptions.RemoveEmptyEntries); var i = 0; for (i = 0; i < ips.Length; i++) { if (ips[i] != "") { // 判断是否为内网IP if (false == IsInnerIp(ips[i])) { IPAddress realIp; if (IPAddress.TryParse(ips[i], out realIp) && ips[i].Split('.').Length == 4) { //合法IP return ips[i]; } return ""; } } } ip = ips[0];// 默认获取***个IP地址 } return ip; } /// /// 判断IP地址是否为内网IP地址 /// /// IP地址 ///private static bool IsInnerIp(string ip) { bool isInnerIp = false; ulong ipNum = 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这个网段是环回地址 */ ulong aBegin = Ip2Ulong("10.0.0.0"); ulong aEnd = Ip2Ulong("10.255.255.255"); ulong bBegin = Ip2Ulong("172.16.0.0"); ulong bEnd = Ip2Ulong("10.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) || ip.Equals("127.0.0.1"); return isInnerIp; } /// /// 将IP地址转换为Long型数字 /// /// IP地址 ///private static ulong Ip2Ulong(string ip) { byte[] bytes = IPAddress.Parse(ip).GetAddressBytes(); ulong ret = 0; foreach (var b in bytes) { ret <<= 8; ret |= b; } return ret; } /// /// 判断用户IP地址转换为Long型后是否在内网IP地址所在范围 /// /// 用户IP /// 开始范围 /// 结束范围 ///private static bool IsInner(ulong userIp, ulong begin, ulong end) { return (userIp >= begin) && (userIp <= end); } /// /// 获取局域网IP /// ///private static string GetLanIp() { foreach (var hostAddress in Dns.GetHostAddresses(Dns.GetHostName())) { if (hostAddress.AddressFamily == AddressFamily.InterNetwork) { return hostAddress.ToString(); } } return string.Empty; } #endregion
看完上述内容,你们对Nginx中怎么利用反向代理获取真实IP有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。
地址
代理
问题
配置
域名
客户
内容
格式
用户
范围
客户端
方法
端的
顶部
应用
服务
合法
代理服务
代码
前言
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
基岩版服务器后台指令
虞城县虞学网络技术有限公司
河北银行服务器维保
宠物交流软件开发策划案
河南舞钢鹰眼神探护卫网络安全
网络安全微演讲
移动软件开发专科年薪
恢复宝石60数据库
v社服务器
甘肃汇宇网络技术有
什么是软件开发中事务
常用软件开发值得推荐
简单app软件开发多少钱
网络安全包括网络信息安全
数据库编程技术入门书籍
易联网络技术公司招聘
大数据库安全运算
FIFA22链接服务器超慢
如何查询戴尔服务器型号
php数据库改变其主键
查看有哪些数据库
东川区品牌软件开发市场价
翟伟斌网络安全
软件开发设计和工程造价
通信发展与网络安全
根据网络安全法的规定市
笔记本怎么连接移动数据库
数据库重组和重构区别
u盘插入服务器不启动
日本科技落后 互联网