找回密码
 注册
查看: 4436|回复: 1

request nginx 透传获取真实的ip

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2019-1-16 22:32:08 | 显示全部楼层 |阅读模式
nginx.conf配置:8 j! m1 P& v+ b* \2 w. |& C

9 D$ [( ^. o5 |% Nlocation / {   
2 t5 y0 ]2 d5 c/ L8 \0 i     proxy_pass http://127.0.0.1:8081/myweb/;  - ~1 f4 ^2 p, x) Q: k9 B
     proxy_redirect    off;  
* ^1 @! C& j6 _0 _2 F     proxy_set_header  Host             $host;  ( G( k* k1 `8 d" e# R4 {5 J9 Z. K! I
     proxy_set_header  X-Real-IP        $remote_addr;  ; w/ r2 }6 R( g# G! o$ t
     proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;  
0 S* D: m% s& v0 X/ ^  n: l}  
5 D2 f) E; z+ J& q9 J: M
' P  M# d8 m  e0 Y! R) K$ u0 \后端获取方式:
9 B0 ^$ d. y6 V0 v1 W$ E
3 z' [! T9 t* U/***   x- O7 ?, N6 Q% A* b
* 获取客户端IP地址;这里通过了Nginx获取;X-Real-IP, % N, l( X# ~0 }* R  F7 ~8 Q  _
* @param request
! H' D, j4 K% H * @return
" N$ @: z$ F6 {) ~$ M */  8 K6 y+ f2 u; y$ l7 y
public static String getClientIP(HttpServletRequest request) {  
: A$ x  }$ ?, ^8 W3 H+ P    String fromSource = "X-Real-IP";  ' I3 F0 U0 t2 o9 g. Z7 z
    String ip = request.getHeader("X-Real-IP");  
  u4 U" ~/ k0 c7 n& k9 L. d' _' i7 J    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  ; z2 f1 F7 Q& B5 p" R; Z8 \
        ip = request.getHeader("X-Forwarded-For");  
0 j8 F! X0 B: L3 y) G3 `6 v        fromSource = "X-Forwarded-For";  
4 w2 M: O/ D  i& s2 @% O/ \3 B+ Y    }  ) L4 \: o- N; ]) {/ O
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  ; k, `; m% R' z; [: I- P
        ip = request.getHeader("Proxy-Client-IP");  
- l: V" L/ E" s. c" @        fromSource = "Proxy-Client-IP";  
$ L; q: @5 e" R5 `1 l7 q    }  
. u5 V. A/ u# @3 q' _, G) p    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  4 I  q+ y2 y7 P( ]# ?8 [  v
        ip = request.getHeader("WL-Proxy-Client-IP");  
* i! }, u6 d% }/ n! s        fromSource = "WL-Proxy-Client-IP";  
" G4 W# n' L( f2 q% V6 l+ A    }  
/ ~, K+ G7 Q8 k& M: L! g/ k% k1 q    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
  a+ c, m& n' D9 V, D        ip = request.getRemoteAddr();  % U' I; J/ a& O# Q3 _' [8 B9 E
        fromSource = "request.getRemoteAddr";  
3 W( p! D% G  `4 `    }  5 ^; P5 s5 M" W4 h/ ~* O
    appLog.info("App Client IP: "+ip+", fromSource: "+fromSource);  
: [7 I* x6 z! Y1 z3 |9 a# |    return ip;  3 b" H+ Q' w- S; z! n
}  / c9 s2 t: ]7 s: q; w: s+ J

1 _5 i% y0 [, ~0 d这样就不会一直获取的是服务器的Ip了。5 X! A, P# k' z$ g4 q% x

: E" y& p; p+ [& U( ^1 k0 P2 Z
9 \5 m, c' [+ x/ V2 g; I

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2019-1-16 22:32:38 | 显示全部楼层
举个例子,Nginx 中的代理配置假如是这样配置的:; D6 H2 v6 R* s. T
1 B8 ]: r9 ]. @# ~
    location / {1 p! L8 J3 f0 b6 P; d, @: \9 I
        proxy_http_version 1.1;" p& `# Z2 B7 K! U) @/ R, I
        proxy_set_header X-Real-IP $remote_addr;
/ _% p' w$ x% v4 @* E* j3 v        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;; V9 ?/ c- i( g  Q
        proxy_set_header Host $http_host;
, o) Y/ ^- K% F! N6 ]5 w6 ]5 M        proxy_set_header X-NginX-Proxy true;  ^" |( n4 l% {, G8 F
        proxy_set_header Upgrade $http_upgrade;
+ S% u/ u- W, d4 C4 Y, e) D        proxy_set_header Connection "upgrade";! x6 M3 f% B4 n; j/ k
        proxy_pass http://127.0.0.1:8080$request_uri;+ f+ l% {& {* |* B
        proxy_redirect off;
' Z5 `$ c) C- \4 {    }
5 r: X; t2 ~5 B( Q& I+ G+ {4 J, T' Y代理的配置中添加了一个自定义 header X-Real-IP,所以你可以在目标服务器中通过 X-Real-IP 这个 header 取到用户的真实 IP。8 M) Z3 e- d9 ?& _9 D  J3 M

3 i1 n3 ^: K' x( ?2 y+ c或者也可以通过取 X-Forwarded-For,这个 header 比较常见,一般的负载均衡器也会添加这个 header 以传递用户的真实 IP。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 03:24 , Processed in 0.020817 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表