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

request nginx 透传获取真实的ip

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2019-1-16 22:32:08 | 显示全部楼层 |阅读模式
nginx.conf配置:
& d1 `& D- T' I; O! N+ m! d6 k" ^' a  i
location / {   " n$ C5 u. P  A5 t
     proxy_pass http://127.0.0.1:8081/myweb/;  
( v2 ~) n1 V; f& N) }     proxy_redirect    off;  6 T# R+ C* ^7 q) Q; k
     proxy_set_header  Host             $host;  ) ]+ {0 D1 |0 f5 ~8 x
     proxy_set_header  X-Real-IP        $remote_addr;    E7 U; h- ~: A) h7 S  ^
     proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;  
- m8 i0 u& |( ~8 L5 q3 Q}  
% r9 I2 V. I- k* `' s4 N0 c( m- \1 t, k  ]8 r8 M# H
后端获取方式:
9 |& s% ^/ C# h
7 c5 H0 ^( S5 H$ A( d: J/ H/*** 0 ~' L+ `8 e; [
* 获取客户端IP地址;这里通过了Nginx获取;X-Real-IP,
4 {0 h0 d- r1 m$ a9 b2 o * @param request
- v0 L  f8 ~5 ~+ V% [/ i* ~ * @return $ m# W, a  r! {* v7 o+ A" o* y
*/  6 r6 _8 s7 t) Z: h, l; Y$ k5 \; ?
public static String getClientIP(HttpServletRequest request) {  ; u7 V% l! G3 l. `5 X9 {2 M9 m! a5 F
    String fromSource = "X-Real-IP";  
: J, p4 A& _$ x, [( J% O& z    String ip = request.getHeader("X-Real-IP");  
0 a/ k0 O% E5 S8 d$ r    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
( X8 M* `2 w7 h# p9 i9 n, u        ip = request.getHeader("X-Forwarded-For");  
" H9 d1 h6 d0 k& n; g        fromSource = "X-Forwarded-For";  
. X+ P+ Q& w8 v9 a) E: A    }  
+ I0 K+ d# ^+ {% P, S    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
% N3 F9 w$ }' p+ m$ V        ip = request.getHeader("Proxy-Client-IP");  9 V$ o/ J0 m( m; i1 E
        fromSource = "Proxy-Client-IP";    j& Y( b9 a- U1 U2 d
    }  ( Z6 x. c: j: X& E. P+ {! E
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
+ Y( p# p1 W6 ^+ w  b- V        ip = request.getHeader("WL-Proxy-Client-IP");  8 y1 }7 X# v5 m0 w; g
        fromSource = "WL-Proxy-Client-IP";  , F4 [  {6 C" G, v/ }* |) {
    }  7 w0 J1 W  {, a) K
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  ! d% D) V' {) W1 Z/ n4 C) Z
        ip = request.getRemoteAddr();  
! b$ @) I0 p- A7 e        fromSource = "request.getRemoteAddr";  
% V' m  A) F$ J) A. b8 A. N, l) f8 k    }  
) u, \3 P+ H( H, K) ?, R    appLog.info("App Client IP: "+ip+", fromSource: "+fromSource);  
! X% g) A( y% Q    return ip;  $ B) G0 C8 B  Z4 K- q
}  
( k& w: o% f: N$ A" D2 [- M: G! o$ K
" O2 ^7 l% z  V这样就不会一直获取的是服务器的Ip了。
) l: p- Y& n. h( t4 `" T7 o- A
9 e9 R+ ^2 |% w7 ]2 a9 l% p$ N* K$ u- ^/ a

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2019-1-16 22:32:38 | 显示全部楼层
举个例子,Nginx 中的代理配置假如是这样配置的:' _" a/ f9 w( C7 Q# g2 {1 t, o

: A7 f: n+ I: p9 O/ ?! ]7 |    location / {
! Z/ W4 s' z( y- p        proxy_http_version 1.1;1 F5 Q* f/ l& [7 w
        proxy_set_header X-Real-IP $remote_addr;4 o8 R7 |! V3 S- w& o. Y: m0 Y# Z
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;9 X! p; p- a3 U# I
        proxy_set_header Host $http_host;, |9 e3 h7 V7 R5 M8 {; U4 h) A
        proxy_set_header X-NginX-Proxy true;. Z5 H# Z, q7 }$ g& i% {& z
        proxy_set_header Upgrade $http_upgrade;. Y" S1 U1 K5 ?. A
        proxy_set_header Connection "upgrade";
$ e. c3 u8 i5 }% F0 m/ t        proxy_pass http://127.0.0.1:8080$request_uri;
% X# p# L4 v' A( l) ?        proxy_redirect off;
1 k( l/ a. R9 @" H9 f3 z    }1 {1 j2 }( Z( e; [. S2 c
代理的配置中添加了一个自定义 header X-Real-IP,所以你可以在目标服务器中通过 X-Real-IP 这个 header 取到用户的真实 IP。* i- l. }5 d+ t/ W3 _% s

" V5 S/ ~' V7 [或者也可以通过取 X-Forwarded-For,这个 header 比较常见,一般的负载均衡器也会添加这个 header 以传递用户的真实 IP。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 04:33 , Processed in 0.016515 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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