我们都知道部署负载均衡做服务器负载均衡的时候,在应用端就无法获取到客户端电脑的真实IP。这个都是因为我们在负载均衡上配置虚拟服务的时候启用了snat功能,将客户端发来的数据包的源IP替换成了负载均衡接口地址,以确保服务器将应答回送给负载均衡,达到数据包来回路径的一致。

  那么如果应用程序需要统计客户端的真实IP该怎么办呢?这个时候就需要开启负载均衡的http改写功能,在http头部中插入X-Forwarded-For字段,以将客户的真实IP携带给服务器。

  X-Forwarded-For(XFF)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。 Squid 缓存代理服务器的开发人员最早引入了这一HTTP头字段,并由IETF在Forwarded-For HTTP头字段标准化草案中正式提出。开启了AD的优化策略后,AD会在客户端的请求报文中http头部中插入这个X-Forwarded-For字段,并写上客户端IP地址。这样后端的服务器就可以通过读取http头部中的X-Forwarded-For来获取客户端的真实IP。

   PHP中有一个超级全局变量,$_SERVER 是一个包含诸如头信息(header)、路径(path)和脚本位置(script locations)的数组。我们可以在 PHP 程序的任何地方直接访问它。在PHP程序中可以通过读取$_SERVER['HTTP_X_FORWARDED_FOR']这个变量来获取到客户端http请求中的X-Forwarded-For字段,而获取到客户端的真实IP。

echo "通过X-Forwarded-For获取到的客户端真实IP:".strstr($_SERVER['HTTP_X_FORWARDED_FOR'], ',', TRUE);