在平时我们开发后端程序的过程中,应该多多少少都会碰到记录客户端 IP 的场景,例如我之前写过的 APP 用户的一个审计功能,就需要获取用户的 IP 地址;还有广告系统里面,也是需要获取用户的 IP 地址,有时这个 IP 地址会被用来标识用户的,因此需要比较准确得获取到用户的地址。当然,在开始本文的内容之前还是有必要强调一下我们现在的网络大环境的,在使用 IP 的时候,我们一定要记住有两个东西很关键,一个是网关,一个是代理。

网关其实好理解,说简单一些的就路由器吧,因为 IPv4 的地址空间是有限的,所以就有了局域网共用一个公网 IP 的事实。这在一个集体里面很容易出现,例如家庭、学校,如果我们不加分辨得直接就使用 IP 来记录或者屏蔽,那么很容易出问题,如果将这个问题再扩大化一点,那就是移动端,因为我们知道移动端都是通过连接信号塔进行数据通信的,那么对于一个范围内的同一运营商来说,IP 地址就很可能是一样的,这是移动开发中一个很关键的点;还有就是代理,很多公司对于网络都是封锁得很严厉的,所以所有的对外流量都通过一个代理交流,这也就导致了很多情况下都是同一个代理出来的都是一个 IP,这也是一个非常重要的问题,很容易一棍子打死一船人。

OK,闲话扯完了,回到主题,在后端程序中,一般客户端/前端的流量都不会直接就打到后端的应用上,正常最少都会加一层反向代理,稍复杂一些的还会有负载均衡啥的,这也给我们提取客户端 IP 带来了很大的麻烦,所以我这里就以 Nginx 为例,说说如何更好得获取正确的 IP 值。

下面下来一段我用了好多年的 Nginx 配置,夸张点说就祖传的吧:

这里会出现了好几个和 IP 有关的字段,这也是获取 IP 的关键,对于这些字段如果我们细致得了解了它的来源和原理之后,那么获取相对准确的 IP 也就没那么困难了,下面就一一进行介绍:

Remote Addr

remote_addr 这个字段不是 http 里面的概念,其实是 tcp 的概念,表示的是当前连接的对端的地址,也就是说:

  • 如果在浏览器和 Nginx 之间不存在其他代理,那么这个字段就是真实的 IP
  • 但是,一旦浏览器和 Nginx 之间存在代理,那么这个字段的值就是最后一个代理的地址

X-Real-IP

正如配置中所示,HTTP 中其实不存在这个 Header,但是在 Nginx 中习惯于用来标识用户的真实地址,至于是否真的是客户端的地址,看前面的 remote_addr 的解释我们就清楚了。

X-Forwarded-For

这个就有意思了,X-Forwarded-For 表示在客户端访问 Nginx 的过程中如果需要经过 HTTP 代理或者负载均衡服务器,可以被用来获取最初发起请求的客户端的 IP 地址,这个消息首部成为事实上的标准。怎么说,其实就是一个 HTTP 请求从浏览器发出,每经过一个 HTTP 代理或者负载均衡,都会在这个 Header 里面添加一条记录(当然,这是规定,你不遵守我也没办法),所以对于一个请求来说,X-Forwarded-For Header 的值列表里面的第一个值应该就是客户端的地址,及时经过了 N 多的代理和负载均衡。

但是,这毕竟不是真正的标准,所以我们不能期望 100% 一定有这个,但是根据我的经验,对于一些比较成熟的反向代理软件 例如 Nginx/Squid 都是有的,所以大多数情况下都可以通过这个字段获取到真实值。

X-Forwarded-Host

好吧,这个 Header 是乱入的,它和客户端的 IP 没啥关系,它其实是标识客户端发起请求时的 Host 的地址,我们可以通过这个 Header 来获取客户端是访问的哪个 Host 进来的。

结论

所以通过上面的介绍,我们知道,其实就只有两个东西,分别是 remote_addrX-Forwarded-For,如果中间存在不可控的代理,那么我们应该优先通过 X-Forwarded-For 的第一个值来获取客户端真实 IP;如果中间的代理都是可控的,那么我们优先通过 remote_addr 来获取客户端真实的 IP,而且这个 IP 是不可伪造的。

转载于:https://www.cnblogs.com/makor/p/Nginx-fan-xiang-dai-li-shi-huo-qu-yong-hu-de-zhen-.html

Nginx 反向代理时获取用户的真实 IP相关推荐

  1. ServletUriComponentsBuilder遇到Nginx反向代理时,无法识别HTTPS

    前言 spring mvc 5.2.9.RELEASE springboot 2.3.4.RELEASE ServletUriComponentsBuilder遇到Nginx反向代理时,无法识别HTT ...

  2. 解决 nginx 反向代理时 session 丢失 无效的问题

    解决 nginx 反向代理时 session 丢失 无效的问题 原文 blog.csdn.net/joyous/article/details/79966593 因为原始路径和代理路径发生了变化,导致 ...

  3. nginx 反向代理时丢失端口的解决方案(转)

    nginx 反向代理时丢失端口的解决方案(转) 参考文章: (1)nginx 反向代理时丢失端口的解决方案(转) (2)https://www.cnblogs.com/shenyixin/p/1136 ...

  4. 白帽子,强大的XSS钓鱼漏洞,怎么获取用户的真实ip

    怎么获取用户的真实ip 在一些网站和一些用户(黑客)一般是对自己的ip进行处理,找不到真实的ip地址 11种绕过CDN查找真实IP方法 一.验证是否存在CDN 1.很简单,使用各种多地 ping 的服 ...

  5. PHP获取用户的真实ip地址

    本文介绍如何使用PHP获取用户的真实ip,并且写入到txt文档 首先创建一个php文件,将下面代码放到PHP文件中 <?php function getIp() { if (getenv(&qu ...

  6. nginx利用反向代理实现获取用户真实ip

    我们访问互联网上的服务时,大多数时,客户端并不是直接访问到服务端的,而是客户端首先请求到反向代理,反向代理再转发到服务端实现服务访问,通过反向代理实现路由/负载均衡等策略.这样在服务端拿到的客户端IP ...

  7. 配置nginx反向代理时,要注意的权限设置

    MYPM演示环境(www.mypm.cc/mypm)中当下载大的附件,或是页面中有大图片时,就会下载中断或是图版无法显示 也许你要说我用的nginx缺省的设置没碰到这问题,那是因为你的网站没大文件 查 ...

  8. PHP 模拟真实ip,PHP实现-获取用户的真实IP

    /** * 获取客户端IP地址 * @param integer   $type 返回类型 0 返回IP地址 1 返回IPV4地址数字 * @param boolean   $adv 是否进行高级模式 ...

  9. 在PHP中如何获取用户的真实IP

    /*** 获得用户的真实IP地址** @access public* @return string*/ function real_ip() {static $realip = NULL;if ($r ...

最新文章

  1. 剑指offer--剪绳子
  2. 【分享】搭建域环境实现主域和文件服务器的热备冗余
  3. 什么是MARC数据?
  4. SEO技巧之网站优化的具体细节
  5. 【报告分享】2020中国248家独角兽报告.pdf(附下载链接)
  6. 在线XML转HTML工具
  7. spring-第十九篇AOP面向切面编程之增强处理的优先级
  8. CA机构是如何保护自己私钥的?
  9. 银联无跳转支付-Token银联侧
  10. 2022年信息安全工程师考试知识点:Web安全
  11. vnr懒人版教程_【visual novel reader最新版】visual novel reader翻译懒人整合版下载 百度云资源 最新版-七喜软件园...
  12. 常见定位技术有哪些?
  13. 坦克世界因计算机丢失,坦克世界新版本上线在即,玩家必须知道的几件事。
  14. iOS 多线程dispatch_async dispatch_sync(GCD)详尽总结
  15. 记录安装tensorflow-gpu,版本选择问题,短平快解决战斗
  16. vue中 this.$set的使用
  17. 工具分享(3):使用Java Swing开发圆形/椭圆公章、私章图片(内附源码)
  18. 军队武器java代码
  19. 【汇正财经】股本的法律规范
  20. 20 React项目生成及部署

热门文章

  1. 浅析Memcache和Redis
  2. sql where子查询5中字句的使用顺序
  3. 第 十 一 天 : 复 习 完 ( 四 )
  4. 我的Android进阶之旅------Android中高低API版本兼容使用@TargetApi或者@SuppressLint(NewApi)...
  5. mysql安装完成后登入错误
  6. 给网页添加二维码功能
  7. 实战:Windows Server 2008 使用WSUS实现内网计算机系统更新
  8. java--HashMap与Hashtable的区别
  9. Stream流综合练习
  10. 高可用的eureka