利用Nginx反向代理怎么獲取真實(shí)IP

本篇文章給大家分享的是有關(guān)利用Nginx 反向代理怎么獲取真實(shí)IP,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),濂溪企業(yè)網(wǎng)站建設(shè),濂溪品牌網(wǎng)站建設(shè),網(wǎng)站定制,濂溪網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,濂溪網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

一、前言

前文Nginx 解決WebApi跨域二次請求以及Vue單頁面問題 當(dāng)中雖然解決了跨域問題帶來的二次請求,但也產(chǎn)生了一個(gè)新的問題,就是如果需要獲取用戶IP的時(shí)候,獲取的IP地址總是本機(jī)地址。

二、原因

由于Nginx反向代理后,在應(yīng)用中取得的IP都是反向代理服務(wù)器的IP,取得的域名也是反向代理配置的Url的域名。

三、解決方案

解決該問題,需要在Nginx反向代理配置中添加一些配置信息,目的將客戶端的真實(shí)IP和域名傳遞到應(yīng)用程序中。同時(shí),也要修改獲取IP地址的方法。

但是需要注意的是,通過Nginx反向代理后,如果訪問IP通過了幾層代理,可能取得的IP地址是這種格式:clientIP,proxy1,proxy2。

如果需要將IP地址插入到數(shù)據(jù)庫的話,需要做防止注入。因此要對上述的IP地址的格式進(jìn)行截取。

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; # 監(jiān)聽端口號(hào)

  server_name localhost 192.168.88.22; # 訪問地址

  location / {

   root 項(xiàng)目路徑; # 例如:E:/Publish/xxx/;

   index index.html;

   

   # 此處用于處理 Vue、Angular、React 使用H5 的 History時(shí) 重寫的問題

   if (!-e $request_filename) {

    rewrite ^(.*) /index.html last;

    break;

   }

  }

  

  # 代理服務(wù)端接口

  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#代碼獲取真實(shí)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遠(yuǎn)程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代理真實(shí)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(", "))

 {

  // 如果存在多個(gè)反向代理,獲得的IP是一個(gè)用逗號(hào)分隔的IP集合,取第一個(gè)

  // X-Forwarded-For: client 第一個(gè)

  string[] ips = ip.Split(new string[1] {", "}, StringSplitOptions.RemoveEmptyEntries);

  var i = 0;

  for (i = 0; i < ips.Length; i++)

  {

   if (ips[i] != "")

   {

    // 判斷是否為內(nèi)網(wǎng)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];// 默認(rèn)獲取第一個(gè)IP地址

 }

 return ip;

}

/// <summary>

/// 判斷IP地址是否為內(nèi)網(wǎng)IP地址

/// </summary>

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

/// <returns></returns>

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

  * 當(dāng)然,還有127這個(gè)網(wǎng)段是環(huán)回地址

  */

 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地址轉(zhuǎn)換為Long型數(shù)字

/// </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地址轉(zhuǎn)換為Long型后是否在內(nèi)網(wǎng)IP地址所在范圍

/// </summary>

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

/// <param name="begin">開始范圍</param>

/// <param name="end">結(jié)束范圍</param>

/// <returns></returns>

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

{

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

}

/// <summary>

/// 獲取局域網(wǎng)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 反向代理怎么獲取真實(shí)IP,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

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

當(dāng)前名稱:利用Nginx反向代理怎么獲取真實(shí)IP
當(dāng)前地址:http://muchs.cn/article26/pisccg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管ChatGPT、網(wǎng)站制作、小程序開發(fā)、軟件開發(fā)響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)