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

request nginx 透传获取真实的ip

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2019-1-16 22:32:08 | 显示全部楼层 |阅读模式
nginx.conf配置:
) w5 D' E3 W2 \1 D0 `* B1 k; x* `3 n- e. ]/ H# H4 S8 u
location / {   0 R2 G- x) o) b5 X
     proxy_pass http://127.0.0.1:8081/myweb/;  
$ G4 k" V9 L5 ?( K# n% S     proxy_redirect    off;  * E* i# z2 m- ?- a9 o. p
     proxy_set_header  Host             $host;  2 Z' I/ N1 \; V
     proxy_set_header  X-Real-IP        $remote_addr;  
1 O- \+ N: O, e: l+ G* j1 R. q     proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;  + ^- ^) i5 a( _" z/ c2 }  u( I& B
}  
! v; D! S: j( m, J( ?7 J. Q0 W/ u5 [( |7 ~
后端获取方式:2 C3 F3 g. Z9 P: Y5 e' w$ O2 f7 U

; B  u! q5 v) x% z  l( Q, H/***
. i( X3 G; l) r8 x, H& m: j * 获取客户端IP地址;这里通过了Nginx获取;X-Real-IP,
- ~4 R. Z0 ]: }* G3 y$ u. i  I9 h# V * @param request
3 f9 M  V5 k5 x8 S7 Q * @return 7 D# C4 u2 ^2 o( r8 G7 z
*/  ( G/ ]/ J+ @  y2 e6 T
public static String getClientIP(HttpServletRequest request) {  & A) q1 V  d( x" r
    String fromSource = "X-Real-IP";  $ m/ f( t* \4 z! e  i/ G
    String ip = request.getHeader("X-Real-IP");  % @5 @2 v2 l& i% d( T
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  4 W# p8 @" q5 P* q, ^  E0 [! g
        ip = request.getHeader("X-Forwarded-For");  
/ J- s$ e6 B" |2 I8 }6 E& S        fromSource = "X-Forwarded-For";  " K7 w* U" @1 N  n) Z$ D; Q+ d& W
    }  
1 k  e+ l* ]! F* n5 q8 y    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  ; S3 p2 E/ N7 T* c- M9 p
        ip = request.getHeader("Proxy-Client-IP");  & Q( l/ n" h/ _2 d7 a( Y
        fromSource = "Proxy-Client-IP";  
/ u2 W. e) m' P* |    }  
7 H& k' J; R) [) u9 c6 V6 ^9 C    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
7 X9 y4 F% k: y- h4 I! x        ip = request.getHeader("WL-Proxy-Client-IP");  
9 `! V9 M8 N$ F  o6 a3 U$ v( s        fromSource = "WL-Proxy-Client-IP";  # Y( g0 ?5 ]. g* A( k
    }  0 j2 o" m0 v" }
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
1 D9 D; {3 ^# S8 S& |: d4 D! R        ip = request.getRemoteAddr();  
0 ]$ B; H& R; a2 |        fromSource = "request.getRemoteAddr";  
  J4 S. w  @0 g0 e  h( R    }  ' s6 u4 _5 r4 E9 x- F
    appLog.info("App Client IP: "+ip+", fromSource: "+fromSource);  
# n+ a, a: ?+ l* ^% |$ R# T    return ip;  & w1 R6 f9 [" b( n
}  
( \- T9 D" V' [& t, H8 ]) J
7 ]5 A7 q' u; \* F  U这样就不会一直获取的是服务器的Ip了。$ v! [1 ~' W8 h! M3 `! t" D

( Q/ S- y8 ]5 s
9 p) ?& Z3 n2 y' U4 O- B. u

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2019-1-16 22:32:38 | 显示全部楼层
举个例子,Nginx 中的代理配置假如是这样配置的:
5 l# |( x" L% X9 V* R9 h# p5 E! O5 w, t, y
    location / {2 [9 `* {, c4 }% P8 H
        proxy_http_version 1.1;
( F  y& i9 E# C5 u/ M        proxy_set_header X-Real-IP $remote_addr;1 T4 \8 ^+ [9 D9 r4 `
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
2 e4 Q, J, R% M; M( ^' A        proxy_set_header Host $http_host;
; B# i# \8 t. k' @  o8 `/ Y        proxy_set_header X-NginX-Proxy true;
0 `2 @5 ]: q5 w( o  ]/ Z, u: `# ^        proxy_set_header Upgrade $http_upgrade;7 R8 j$ D4 R4 x: z5 P
        proxy_set_header Connection "upgrade";1 S, X/ Y) }& O& l# F3 }, z6 ^& b
        proxy_pass http://127.0.0.1:8080$request_uri;
6 ~$ r4 A0 j- b/ I3 W; z& p3 Z        proxy_redirect off;
/ u' K, U7 `- a8 w3 g9 ]( p8 C* _6 M  M    }
/ k! v) B( c5 d: L代理的配置中添加了一个自定义 header X-Real-IP,所以你可以在目标服务器中通过 X-Real-IP 这个 header 取到用户的真实 IP。
$ A' P* {) g5 [! X& R) f
0 I- Q* e" h% }4 I& X2 \9 S或者也可以通过取 X-Forwarded-For,这个 header 比较常见,一般的负载均衡器也会添加这个 header 以传递用户的真实 IP。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 04:26 , Processed in 0.031776 second(s), 21 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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