易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 4432|回复: 1
收起左侧

request nginx 透传获取真实的ip

[复制链接]
发表于 2019-1-16 22:32:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?开始注册

x
nginx.conf配置:
' B8 z$ O+ M, z/ K( n7 w; V
/ ]9 ^6 ~- U" Ulocation / {   
9 x% T& V/ Q* s' f+ R     proxy_pass http://127.0.0.1:8081/myweb/;  
& {" F, A' N# l& K( J: ^     proxy_redirect    off;  
! F9 R/ f, l3 X0 \7 l3 I     proxy_set_header  Host             $host;  
  F9 m; z; W' p1 p     proxy_set_header  X-Real-IP        $remote_addr;  
2 X$ u- a: e4 |( z$ X0 x( X     proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;  # f. l) g& R7 ^; Z) d! ^+ @
}  2 \1 h$ |( P; |  _; _

0 P4 e& }0 R0 q# ?/ X6 n后端获取方式:. F0 H  R# o' ^/ D# Z. g1 T7 \
1 |! p  r0 V" c' C9 \# P
/***
( {" E; l3 [  I; S* B4 U * 获取客户端IP地址;这里通过了Nginx获取;X-Real-IP,
' n) O( U) U( u * @param request ( q6 g( r- W* q9 X! T( \  t
* @return
. G0 ~8 K" H! a: e */  ) ^2 v. I" d: o% O1 P7 f$ i
public static String getClientIP(HttpServletRequest request) {  
4 r2 ~3 H) G& K- Y) e. x    String fromSource = "X-Real-IP";  
+ k$ z3 D8 Z4 ~' ?( B    String ip = request.getHeader("X-Real-IP");  ; o: h7 M  V; K, n5 z) ^- y$ @
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
) ^3 n% K1 O% M5 w! J9 I( R        ip = request.getHeader("X-Forwarded-For");  9 d6 H0 S! Y7 h& K
        fromSource = "X-Forwarded-For";  , s! \' A8 I+ M. ]$ T
    }  
2 x) e+ x9 j/ Z  j* x( {) X. G    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  2 H6 q( A% b. v3 U0 P
        ip = request.getHeader("Proxy-Client-IP");  3 s6 W4 f0 K4 t# @8 B4 T
        fromSource = "Proxy-Client-IP";  
4 @! M  ~# z) w/ D+ V( W5 Y    }  
# M' _& {$ ]1 N+ l* N5 t5 f( x: `* `+ }    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
7 X$ Z9 F; B  ~( h        ip = request.getHeader("WL-Proxy-Client-IP");  4 H# `/ M* V4 r( k; y( R
        fromSource = "WL-Proxy-Client-IP";  5 _7 ~; u, @! o( D1 i8 C' E
    }  
2 U; P7 \0 u9 a2 Q& z1 d4 r    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  & T, u9 H, i2 o/ S( ?' t
        ip = request.getRemoteAddr();  
% j, c1 V) k/ l# H        fromSource = "request.getRemoteAddr";  ! s4 P& ^8 d9 M8 a$ E& T) _% J5 Q
    }  
; c; |& r3 |1 O7 o    appLog.info("App Client IP: "+ip+", fromSource: "+fromSource);  
4 ]* ]3 b3 H7 p2 Y+ s    return ip;  
/ z3 h; {3 r! W}  : x2 e0 v9 q2 ^9 y0 ?0 ]  F3 E

% z7 K: b3 q" j  ~, A4 u! E/ H这样就不会一直获取的是服务器的Ip了。
4 X% v5 b+ U- m, w1 Z2 J) P1 w7 D3 ?8 j; m' S) h9 e

1 z/ x) f: V0 R$ z1 c
 楼主| 发表于 2019-1-16 22:32:38 | 显示全部楼层
举个例子,Nginx 中的代理配置假如是这样配置的:6 F6 W7 d, r/ C6 @1 O

4 Q! R. o' _# z$ v1 C- ~+ k) y* f    location / {" }, x! F: U8 j4 s/ x
        proxy_http_version 1.1;; o2 A; e& I1 C7 i& r6 P
        proxy_set_header X-Real-IP $remote_addr;) B' S5 f) U( A) J5 ^9 d
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
7 k9 c- t' N9 \9 l) U5 @        proxy_set_header Host $http_host;6 c& A& \8 ^4 _& P3 Z" w  B
        proxy_set_header X-NginX-Proxy true;% }8 Q5 G7 U7 R" U$ J" s, f
        proxy_set_header Upgrade $http_upgrade;0 `- v: Y1 y  b: S
        proxy_set_header Connection "upgrade";" l5 w. U7 s' @2 z2 F# q( a
        proxy_pass http://127.0.0.1:8080$request_uri;; c8 u, G7 A: z, R( T
        proxy_redirect off;
, h7 S8 a# E* J+ @8 i    }+ {4 W# l8 i& A9 m3 T" O9 R
代理的配置中添加了一个自定义 header X-Real-IP,所以你可以在目标服务器中通过 X-Real-IP 这个 header 取到用户的真实 IP。4 T3 \) L2 g/ s* e0 J2 i3 C3 Q
  s9 k, \, C( y' N
或者也可以通过取 X-Forwarded-For,这个 header 比较常见,一般的负载均衡器也会添加这个 header 以传递用户的真实 IP。
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )点击这里给我发消息

GMT+8, 2026-4-8 21:40 , Processed in 0.048489 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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