易陆发现互联网技术论坛

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

request nginx 透传获取真实的ip

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

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

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

x
nginx.conf配置:
/ r0 R) D+ `' \5 f5 m: f; j- {6 i8 k$ ?% g9 ~
location / {   0 f8 s# a9 x  k0 G$ [! s
     proxy_pass http://127.0.0.1:8081/myweb/;  % n" u( T/ b) ?5 q+ {% D
     proxy_redirect    off;  . {! {# x5 N) {$ u. w6 u/ S  F
     proxy_set_header  Host             $host;  
+ C$ r4 I  A  W* e$ t     proxy_set_header  X-Real-IP        $remote_addr;  
$ z9 R3 L+ }& N0 M5 \     proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;  
7 ^; D( H9 _# t( s}  
, H" z  I1 n- S! o) x' k; U7 O& U7 {
% l& z5 K! ?, N后端获取方式:
: g: U5 O* v7 p( V6 L8 ?, k# v* m. D, U5 f: W
/*** 8 r' t1 a0 B; v7 Y6 E$ v( v" \
* 获取客户端IP地址;这里通过了Nginx获取;X-Real-IP, # x. w- X# u& r0 O, L$ k% E+ r
* @param request
! d8 j( w/ i1 B, h* K * @return
( {/ }3 U) `- c1 ?' T; x */  
1 o3 |% x; K* P/ x6 [public static String getClientIP(HttpServletRequest request) {  
% ]7 W6 l$ ~5 R' I2 t    String fromSource = "X-Real-IP";  
+ O9 P% ]6 r: Z( _+ L    String ip = request.getHeader("X-Real-IP");  3 \: G; d/ F+ `" g- p
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
5 f/ t; |) z% h9 W4 ?' ]        ip = request.getHeader("X-Forwarded-For");  
- Z, I  k( q/ a9 U1 ]4 D        fromSource = "X-Forwarded-For";  ! Y/ X0 X4 E8 L5 q$ \
    }  
- v! j# }$ E8 @- O! ?    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
. e: i2 p! Q+ R+ |5 m: K) @        ip = request.getHeader("Proxy-Client-IP");  
8 P! _' J) g* D' o. I: S/ D        fromSource = "Proxy-Client-IP";  % a! a; I; V: u* k* V' a# p9 S/ }( @
    }  6 l/ D9 L, p& a7 Z+ T2 T! L: [
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
* x* Y1 I5 v$ x3 d9 ~        ip = request.getHeader("WL-Proxy-Client-IP");  & M+ Y; Z5 K0 }  G0 g
        fromSource = "WL-Proxy-Client-IP";  
+ N" t6 e- O9 f- W    }  
; d* `" n7 {: k7 x: j2 _1 H, G+ \, I/ Q    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
" q( ]$ K" @6 l' u6 w$ A        ip = request.getRemoteAddr();  3 \  j) o8 d. U) d, k& K
        fromSource = "request.getRemoteAddr";  
$ E5 X! A4 @( A( E    }  
; `8 s' R7 p5 t    appLog.info("App Client IP: "+ip+", fromSource: "+fromSource);  ; h8 M9 M0 v$ L# t% W
    return ip;  9 \9 _9 u3 n5 c
}  0 O) [, l" p3 a5 Q

$ L. w2 t2 w( ~这样就不会一直获取的是服务器的Ip了。$ }8 _- r5 _0 a
- s+ ~: w& d! H. v9 R0 r
* A: @& F7 [7 J, X: y/ `
 楼主| 发表于 2019-1-16 22:32:38 | 显示全部楼层
举个例子,Nginx 中的代理配置假如是这样配置的:* b, P0 P7 a+ E0 _+ |  u/ K. `

/ w: q3 n/ C, t    location / {: E$ Q3 b+ K' S# \: u( g
        proxy_http_version 1.1;
# E" e6 h# F, z( G1 C6 i        proxy_set_header X-Real-IP $remote_addr;1 g; W5 g0 ~/ @# |2 r+ k3 C
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
4 X: J( t( T4 G        proxy_set_header Host $http_host;$ ~+ Q. F1 X# I& p  u
        proxy_set_header X-NginX-Proxy true;
8 T' l. U5 K2 x. G' F; P        proxy_set_header Upgrade $http_upgrade;
" J! \! U0 r) H* M6 [        proxy_set_header Connection "upgrade";7 e  |0 a6 h" V' E, ]
        proxy_pass http://127.0.0.1:8080$request_uri;) u8 P" u# }& V8 D
        proxy_redirect off;
2 T9 e9 N& y- i6 _    }5 N# Q+ ]( ~) r6 f( d" C
代理的配置中添加了一个自定义 header X-Real-IP,所以你可以在目标服务器中通过 X-Real-IP 这个 header 取到用户的真实 IP。
( s! i8 V) Z  M* ^7 u) l
3 K( F9 g  E9 l) E4 n8 q4 s. ?或者也可以通过取 X-Forwarded-For,这个 header 比较常见,一般的负载均衡器也会添加这个 header 以传递用户的真实 IP。
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

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

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

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

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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