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

request nginx 透传获取真实的ip

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2019-1-16 22:32:08 | 显示全部楼层 |阅读模式
nginx.conf配置:) C$ v( w% p# X# f
& F6 f9 F  {9 W- y( Z
location / {   . r3 L" X2 u) u" }
     proxy_pass http://127.0.0.1:8081/myweb/;  
+ _; z% }4 a$ \9 o     proxy_redirect    off;  # v1 S. k4 y4 u  u5 N/ ?
     proxy_set_header  Host             $host;  
6 W& ?+ b$ @6 U& p& g     proxy_set_header  X-Real-IP        $remote_addr;  
) Z3 P# H# o/ d/ R$ r     proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;  
5 `; a' [, r# P2 X1 ~. I& y}  , _, |/ n* A1 |9 z( Y

; |9 P; D  {  d0 E3 O后端获取方式:
5 G/ ^8 e; P. S; t0 L' C7 {. e
+ q; w1 o, k+ }6 r! A1 D8 B9 `3 x/***
4 i8 C$ i: H% A, E * 获取客户端IP地址;这里通过了Nginx获取;X-Real-IP, , a: H. U- l- R7 v
* @param request 3 j( R. T; Y$ x0 [
* @return
6 h1 |/ A) l8 M */  
5 ~6 ?3 H8 J$ y, J7 ^9 C8 o# qpublic static String getClientIP(HttpServletRequest request) {  
5 z& Q8 C) C7 u. d; K    String fromSource = "X-Real-IP";  
6 L; ^8 l$ r/ n& ^2 u    String ip = request.getHeader("X-Real-IP");  4 y8 B$ p, w5 ]+ w5 }  N
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  ! w8 a, G( p2 [# K) ~) g& m. W" B
        ip = request.getHeader("X-Forwarded-For");  / z- {- U( n6 g
        fromSource = "X-Forwarded-For";  
0 H" c0 S" r9 S$ B$ R5 F$ L    }  ; X- ^/ P2 B1 ~) B5 {- a; N
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
3 @) R8 X% [8 O' I! i        ip = request.getHeader("Proxy-Client-IP");  
5 R6 ?7 Y- P1 w. f        fromSource = "Proxy-Client-IP";  
! Z7 o0 [  O! @; s% j2 y3 M    }  ' V4 W$ C9 W, R8 k! U
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
5 P4 p1 Q4 X2 z) l8 p. q        ip = request.getHeader("WL-Proxy-Client-IP");  ; n# @2 [0 Q; y. _6 v6 m
        fromSource = "WL-Proxy-Client-IP";  
  U) S+ s8 [" G/ Y# |% a$ w% T4 {( ^    }  
+ s6 o9 v+ n: m    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
# |: J' b7 r/ G        ip = request.getRemoteAddr();  
; r4 N% y7 V  C2 C2 m2 w. f# v( y; Z        fromSource = "request.getRemoteAddr";  + `* j/ Y8 X' a% ~
    }  7 I  u- a1 G  u$ G" K
    appLog.info("App Client IP: "+ip+", fromSource: "+fromSource);  . O- M  v2 B$ U( S5 e( e3 M
    return ip;  - O, v: O/ }( X$ z( x, {  s. {, z$ s& X
}  
0 z4 o7 {9 K, G
6 B' a! @5 i& j/ m( d这样就不会一直获取的是服务器的Ip了。
. i2 q! W1 P$ U& D" \/ D+ q, |5 r1 h+ A0 y5 I7 E+ e  U

" g; `  J4 [" \

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2019-1-16 22:32:38 | 显示全部楼层
举个例子,Nginx 中的代理配置假如是这样配置的:- f- @2 f$ |, ?; c

$ k" Z6 \( [( a) [* A% S    location / {! h6 L% ?6 t4 ^0 ~* A* w
        proxy_http_version 1.1;7 k! Y5 \+ |( L7 T* Q' Y" H
        proxy_set_header X-Real-IP $remote_addr;
( W# \; `6 [& i% X2 o# S        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
, L& Q1 h8 X. W) L/ @% Y( z        proxy_set_header Host $http_host;' u/ P. h( E/ n  d
        proxy_set_header X-NginX-Proxy true;
) T3 E4 g5 E9 a2 ]        proxy_set_header Upgrade $http_upgrade;0 K5 @% W6 G$ b  x( \" l+ {$ n! A
        proxy_set_header Connection "upgrade";4 r1 P; i# ?/ N9 N( o# G. d8 F
        proxy_pass http://127.0.0.1:8080$request_uri;
7 T3 ~4 M/ L2 t1 F        proxy_redirect off;$ x( q1 _5 G# x' D9 b; |6 s! o# y
    }+ T+ Q& N3 a3 V* i
代理的配置中添加了一个自定义 header X-Real-IP,所以你可以在目标服务器中通过 X-Real-IP 这个 header 取到用户的真实 IP。
8 L8 B1 [% ^4 V! _% w2 L% c( m$ r! n7 Y0 P
或者也可以通过取 X-Forwarded-For,这个 header 比较常见,一般的负载均衡器也会添加这个 header 以传递用户的真实 IP。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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