广告
返回顶部
首页 > 资讯 > 精选 >利用Nginx 反向代理怎么获取真实IP
  • 653
分享到

利用Nginx 反向代理怎么获取真实IP

2023-06-08 00:06:32 653人浏览 泡泡鱼
摘要

本篇文章给大家分享的是有关利用Nginx 反向代理怎么获取真实IP,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、前言前文Nginx 解决webapi跨域二次请求以及Vue单

本篇文章给大家分享的是有关利用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 配置如下

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

server {

  listen  9461; # 监听端口号

  server_name localhost 192.168.88.22; # 访问地址

  location / {

   root 项目路径; # 例如:E:/Publish/xxx/;

   index index.html;

   

   # 此处用于处理 Vue、angularReact 使用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方法

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

#region Ip(客户端IP地址)

/// <summary>

/// 客户端IP地址

/// </summary>

public static string Ip

{

 get

 {

  var result = string.Empty;

  if (HttpContext.Current != null)

  {

   result = GetWEBClientIp();

  }

  if (string.IsNullOrWhiteSpace(result))

  {

   result = GetLanIp();

  }

  return result;

 }

}

/// <summary>

/// 获取Web客户端的IP

/// </summary>

/// <returns></returns>

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;

}

/// <summary>

/// 获取Web远程IP

/// </summary>

/// <returns></returns>

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;

 }

}

/// <summary>

/// 获取Web代理真实IP

/// </summary>

/// <returns></returns>

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;

}

/// <summary>

/// 判断IP地址是否为内网IP地址

/// </summary>

/// <param name="ip">IP地址</param>

/// <returns></returns>

private static bool IsInnerIp(string ip)

{

 bool isInnerIp = false;

 ulong ipNum = Ip2Ulong(ip);

 

 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;

}

/// <summary>

/// 将IP地址转换为Long型数字

/// </summary>

/// <param name="ip">IP地址</param>

/// <returns></returns>

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;

}

/// <summary>

/// 判断用户IP地址转换为Long型后是否在内网IP地址所在范围

/// </summary>

/// <param name="userIp">用户IP</param>

/// <param name="begin">开始范围</param>

/// <param name="end">结束范围</param>

/// <returns></returns>

private static bool IsInner(ulong userIp, ulong begin, ulong end)

{

 return (userIp >= begin) && (userIp <= end);

}

/// <summary>

/// 获取局域网IP

/// </summary>

/// <returns></returns>

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,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网精选频道。

原文链接:http://www.cnblogs.com/jianxuanbing/p/8254284.html

--结束END--

本文标题: 利用Nginx 反向代理怎么获取真实IP

本文链接: https://www.lsjlt.com/news/250503.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 利用Nginx 反向代理怎么获取真实IP
    本篇文章给大家分享的是有关利用Nginx 反向代理怎么获取真实IP,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、前言前文Nginx 解决WebApi跨域二次请求以及Vue单...
    99+
    2023-06-08
  • 基于nginx反向代理获取用户真实Ip地址详解
    目录引言1.修改Nginx配置:2.java获取客户端Ip附:一个ip工具类总结引言 nginx做反向代理时,默认的配置后端获取到的Ip地址都来自于nginx,用request.ge...
    99+
    2022-11-13
  • 基于nginx反向代理如何获取用户真实Ip地址
    小编给大家分享一下基于nginx反向代理如何获取用户真实Ip地址,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!引言nginx做反向代理时,默认的配置后端获取到的I...
    99+
    2023-06-29
  • Nginx反向代理后无法获取客户端真实IP地址
    目录1、原始配置文件如下2、配置转发后当我们使用 Nginx 代理转发服务后,会发现我们无法获取客户端的真实IP地址,从而无法获取客户端的地理位置等信息。 1、原始配置文件如下 wo...
    99+
    2023-03-06
    Nginx反向代理获取IP地址 Nginx代理IP地址
  • Nginx反向代理后无法获取客户端真实IP地址怎么解决
    这篇文章主要介绍“Nginx反向代理后无法获取客户端真实IP地址怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Nginx反向代理后无法获取客户端真实IP地址怎么解决”文章能帮助大家解决问题。...
    99+
    2023-07-05
  • Nginx代理后获取客户端真实IP地址
    1、场景 在项目实际应用中,我们可能会需要获取到用户也就是客户端的真实IP地址,比如记录系统操作日志等情况。 2、使用 通常情况下我们可以使用以下方式来获取IP地址 request.getRemoteAddr() 但是当我们使用Nginx反...
    99+
    2023-09-06
    java获取用户真实IP地址 nginx获取用户真实IP地址
  • 基于nginx获取代理服务ip以及客户端真实ip详解
    目录一、问题背景二、proxy_set_header 语法三、X-Real-IP四、X-Forwarded-For总结 一、问题背景 在实际应用中,我们可能需要获取用户的i...
    99+
    2022-11-13
  • Centos7怎么实现nginx反向代理
    本篇内容主要讲解“Centos7怎么实现nginx反向代理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Centos7怎么实现nginx反向代理”吧!反向代理服务器架设在服务器端,通过缓冲经常被...
    99+
    2023-06-27
  • Nginx中怎么实现反向代理
    这篇文章给大家介绍Nginx中怎么实现反向代理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1 建立用户及组/usr/sbin/groupadd www  ...
    99+
    2022-10-19
  • Nginx反向代理钓鱼怎么实现
    本篇内容主要讲解“Nginx反向代理钓鱼怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Nginx反向代理钓鱼怎么实现”吧!什么是反向代理这里我找了一段比较官方的解释。反向代理(Rever...
    99+
    2023-06-17
  • 服务器的真实IP怎么利用java进行获取
    这篇文章将为大家详细讲解有关服务器的真实IP怎么利用java进行获取,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。实现代码:import java.io.BufferedReader;imp...
    99+
    2023-05-31
    java ava ip
  • Nginx反向代理转发tomcat怎么实现
    本篇内容主要讲解“Nginx反向代理转发tomcat怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Nginx反向代理转发tomcat怎么实现”吧!先说正向代理,比如要访问youtube,...
    99+
    2023-07-02
  • 利用nginx/apache代理wss 实现 小程序 端口 反向代理
    除了用Workerman自身的SSL,也可以利用nginx/apache作为wss代理转发给workerman 我就是栽在这大坑里(nginx/apache代理wss,workerman部分就不要设置ssl,否则将无法连接,两个方法2选1)...
    99+
    2023-09-22
    nginx apache 运维
  • 项目中Nginx多级代理是如何获取客户端的真实IP地址
    目录多级代理中获取客户端真实IP日志的格式获取客户端真实IP总结:多级代理中获取客户端真实IP 日志的格式 nginx中常用日志格式配置如下: log_format main '...
    99+
    2022-11-13
  • Nginx 怎么实现Web服务器反向代理
    本篇内容介绍了“Nginx 怎么实现Web服务器反向代理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Ng...
    99+
    2022-10-19
  • 怎么利用在线代理ip获取网络资源
    这篇文章主要介绍“怎么利用在线代理ip获取网络资源”,在日常操作中,相信很多人在怎么利用在线代理ip获取网络资源问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么利用在线代理ip获取网络资源”的疑惑有所帮助!...
    99+
    2023-06-20
  • 阿里云服务器nginx反向代理怎么用
    安装nginx反向代理软件 首先,我们需要在阿里云控制台下载并安装nginx反向代理软件。这个软件可以从阿里云官网上下载,安装完成后会自动连接到阿里云服务器。 配置nginx反向代理 我们需要配置nginx反向代理软件的IP地址、端口号、...
    99+
    2023-10-27
    阿里 服务器 nginx
  • 怎么通过Nginx反向代理实现kibana登录认证
    本篇内容主要讲解“怎么通过Nginx反向代理实现kibana登录认证”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么通过Nginx反向代理实现kibana登录认证”吧!安装Apache Htt...
    99+
    2023-06-27
  • CentOS 7中怎么使用cPanel配置Nginx反向代理
    本文小编为大家详细介绍“CentOS 7中怎么使用cPanel配置Nginx反向代理”,内容详细,步骤清晰,细节处理妥当,希望这篇“CentOS 7中怎么使用cPanel配置Nginx反向代理”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢...
    99+
    2023-06-27
  • 怎么使用Nginx作反向代理配置GZip压缩
    这篇文章主要介绍了怎么使用Nginx作反向代理配置GZip压缩的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用Nginx作反向代理配置GZip压缩文章都会有所收获,下面我们一起来看看吧。前提条件: nod...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作