三、如何在使用代理后获取用户ip

在《实战nginx》中,有这么一句话:

经过反向代理后,由于在客户端和web服务器之间增加了中间层,因此web服务器无法直接拿到客户端的ip,通过$remote_addr变量拿到的将是反向代理服务器的ip地址。

这句话的意思是说,当你使用了nginx反向服务器后,在web端使用request.getRemoteAddr()(本质上就是获取$remote_addr),取得的是nginx的地址,即$remote_addr变量中封装的是nginx的地址,当然是没法获得用户的真实ip的。但是,nginx是可以获得用户的真实ip的,也就是说nginx使用$remote_addr变量时获得的是用户的真实ip,如果我们想要在web端获得用户的真实ip,就必须在nginx里作一个赋值操作,即我在上面的配置:

proxy_set_header X-Real-IP $remote_addr;

$remote_addr 只能获取到与服务器本身直连的上层请求ip,所以设置$remote_addr 一般都是设置第一个代理上面;但是问题是,有时候是通过cdn访问过来的,那么后面web服务器获取到的,永远都是cdn 的ip 而非真是用户ip,那么这个时候就要用到X-Forwarded-For 了,这个变量的意思,其实就像是链路反追踪,从客户的真实ip为起点,穿过多层级的proxy ,最终到达web 服务器,都会记录下来,所以在获取用户真实ip的时候,一般就可以设置成 下面的配置

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

X-Forwarded-For变量,这是一个squid开发的,用于识别通过HTTP代理或负载平衡器原始IP一个连接到Web服务器的客户机地址的非rfc标准,如果有做X-Forwarded-For设置的话,每次经过proxy转发都会有记录,格式就是client1,proxy1,proxy2以逗号隔开各个地址,由于它是非rfc标准,所以默认是没有的,需要强制添加。在默认情况下经过proxy转发的请求,在后端看来远程地址都是proxy端的ip 。也就是说在默认情况下我们使用request.getAttribute(“X-Forwarded-For”)获取不到用户的ip,如果我们想要通过这个变量获得用户的ip,我们需要自己在nginx添加配置:proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

意思是增加一个$proxy_add_x_forwarded_for到X-Forwarded-For里去,注意是增加,而不是覆盖,当然由于默认的X-Forwarded-For值是空的,所以我们总感觉X-Forwarded-For的值就等于$proxy_add_x_forwarded_for的值,实际上当你搭建两台nginx在不同的ip上,并且都使用了这段配置,那你会发现在web服务器端通过request.getAttribute(“X-Forwarded-For”)获得的将会是客户端ip和第一台nginx的ip。

那么$proxy_add_x_forwarded_for又是什么?

$proxy_add_x_forwarded_for变量包含客户端请求头中的X-Forwarded-For与$remote_addr两部分,他们之间用逗号分开。

举个例子,有一个web应用,在它之前通过了两个nginx转发,www.linuxidc.com即用户访问该web通过两台nginx。

在第一台nginx中,使用:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

现在的$proxy_add_x_forwarded_for变量的X-Forwarded-For部分是空的,所以只有$remote_addr,而$remote_addr的值是用户的ip,于是赋值以后,X-Forwarded-For变量的值就是用户的真实的ip地址了。

到了第二台nginx,使用:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

现在的$proxy_add_x_forwarded_for变量,X-Forwarded-For部分包含的是用户的真实ip,$remote_addr部分的值是上一台nginx的ip地址,于是通过这个赋值以后现在的X-Forwarded-For的值就变成了“用户的真实ip,第一台nginx的ip”,这样就清楚了吧。

Nginx获取客户端真实ip相关推荐

  1. Nginx 获取客户端真实IP $remote_addr与X-Forwarded-For

    nginx配置 首先,一个请求肯定是可以分为请求头和请求体的,而我们客户端的IP地址信息一般都是存储在请求头里的.如果你的服务器有用Nginx做负载均衡的话,你需要在你的location里面配置X-R ...

  2. 获取客户端真实IP地址

    Java-Web获取客户端真实IP: 发生的场景:服务器端接收客户端请求的时候,一般需要进行签名验证,客户端IP限定等情况,在进行客户端IP限定的时候,需要首先获取该真实的IP. 一般分为两种情况: ...

  3. Java正确获取客户端真实IP方法整理

    转载自 干货:Java正确获取客户端真实IP方法整理 在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apach ...

  4. 获取客户端真实 IP

    Tomcat + Nginx 反向代理获取客户端真实IP.域名.协议.端口 Nginx 反向代理后,Servlet 应用通过 request.getRemoteAddr() 取到的 IP 是 Ngin ...

  5. 获取客户端真实ip的方法

    为什么需要获取客户端真实ip ip地址是按地域分布的,服务器获取到客户端ip后可以做流量统计和分析,服务器也可以针对客户端ip做一些定制化的功能,比如限流和黑白名单. 网络环境十分复杂,客户端发出的一 ...

  6. NGINX根据客户端真实ip限制/referer限制

    最近后端服务被攻击,所有接口被疯狂调用,记录一次nginx应对攻击的方案,包括黑白名单.referer限定等. 一.NGINX根据用户真实IP限源 1.nginx日志打印 在nginx.conf配置文 ...

  7. 如何获取客户端真实 IP?从 Gin 的一个 Bug 说起

    1. 背景 请求 IP 作为用户的身份标识属性之一,是一种非常重要的基础数据.在很多场景下,我们会基于客户端请求 IP 去做网络安全攻击防范或访问风险控制.通常我们可以通过 HTTP 协议 Reque ...

  8. vue获取url中ip_Kubernetes 集群中这样获取客户端真实 IP

    Kubernetes 依靠 kube-proxy 组件实现 Service 的通信与负载均衡.在这个过程中,由于使用了 SNAT 对源地址进行了转换,导致 Pod 中的服务拿不到真实的客户端 IP 地 ...

  9. 获取客户端真实IP方法

    2019独角兽企业重金招聘Python工程师标准>>> 我们经常会记录审计日志,那么如何获取客户端真实IP呢?让我们了解一下HTTP协议头吧. 在讨论获取客户端IP 地址前,我们首先 ...

最新文章

  1. java用构造方法定义book类_JAVA基础学习之路(三)类定义及构造方法
  2. 基于requests模块的cookie,session和线程池爬取
  3. TCP/IP / 三次握手之状态转换图和原因
  4. 基于ZooKeeper的Dubbo简单抽样登记中心
  5. android 如何在线程缓存实体类
  6. 看穿这些套路,你的kubernetes会更香
  7. java 栈 先进后出_栈先进后出,堆先进先出
  8. 2017.5.3 博客园自动生成章节目录
  9. STM32工作笔记0064---输入捕获实验
  10. [转]浅谈 python multiprocessing(多进程)下如何共享变量
  11. 魔百盒哪款型号配置高_砂石厂都在用哪种洗砂设备,哪款洗沙机效率更高?
  12. Hibernate 二级缓存和查询缓存
  13. MS08067 知识星球 “网络安全应急响应训练班”,限时免费加入~
  14. 微信 JS-SDK 说明文档
  15. 论文参考文献尾注引用方法
  16. 域名备案和网站备案有什么区别?
  17. java能自学吗_java能自学吗?
  18. uniapp遮罩_uni-app实现弹窗遮罩
  19. 云原生爱好者周刊:mist.io 开源多云管理平台
  20. vivo电池损耗指令代码_vivo手机电池换新活动开启,69起即可换新电池

热门文章

  1. NBA篮球英语专业术语
  2. 关于 爬虫使用 urllib.urlopen 提交默认 User-Agent值
  3. LWN: 内核staging目录的驱动们最后下场如何?
  4. win10磁盘管理_Win10系统如何分区
  5. 重磅 | 2018年淘宝村、淘宝镇名单正式公布!
  6. 怎样用计算机命令修复软件,chkdsk磁盘修复命令工具怎么用,怎样运行chkdsk工具修复?...
  7. 细数一对一社交源码调和延时卡顿问题的小技巧
  8. Java multiplechoice,雅思听力八大题型之Multiple Choice题型篇
  9. Redis、MongoDB及Memcached的区别,java架构师课程推荐
  10. iOS开发Implicit declaration of function 'XXXX' is invalid in C99” 报错问题