PHP 获取客户端ip

1. 介绍

在网站开发时,经常需要获取访问用户的IP地址。IP地址是用来唯一标识网络中的计算机的地址。PHP作为服务器端脚本,可以获取客户端IP地址。本文将介绍如何使用PHP获取客户端IP地址。

2. 获取客户端IP地址的方法

2.1 使用$_SERVER变量获取IP地址

PHP提供了$_SERVER超全局变量,可以获取到当前脚本的请求头信息,其中包括了客户端的IP地址。使用$_SERVER['REMOTE_ADDR']可以获取客户端的IP地址,示例如下:

// 获取客户端IP地址

$ip = $_SERVER['REMOTE_ADDR'];

// 输出客户端IP地址

echo "客户端IP地址:".$ip;

要注意的是,使用$_SERVER变量获取的IP地址仅仅是客户端的IP地址,而不是代理服务器的IP地址。如果客户端是通过代理服务器(如VPN)访问网站,则不能获取到客户端的真实IP地址。

2.2 使用HTTP_X_FORWARDED_FOR头获取IP地址

如果客户端是通过代理服务器访问网站,PHP提供了HTTP_X_FORWARDED_FOR头用来获取客户端的真实IP地址。这个头包含了客户端经过的所有代理服务器的IP地址,以逗号分隔。可以使用explode函数将它们拆分开来,获取客户端的真实IP地址。

// 获取客户端IP地址

if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))

{

$ip = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR'])[0];

}

else

{

$ip = $_SERVER['REMOTE_ADDR'];

}

// 输出客户端IP地址

echo "客户端IP地址:".$ip;

接下来,我们将对上面的代码进行一些优化,从而可以兼顾两种获取IP地址的方法。

3. 最终方案

结合前面两种方法,我们可以写出一个通用的获取客户端IP地址的函数,代码如下:

/**

* 获取客户端IP地址

*/

function getClientIP()

{

if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))

{

// 使用代理服务器访问网站

$ips = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);

$count = count($ips);

for($i = 0; $i < $count; $i++)

{

if(!preg_match("/^(10|172\.16|192\.168)\./i", $ips[$i]))

{

// 不是内网IP,则返回该IP

return $ips[$i];

}

}

}

else

{

// 没有使用代理服务器访问网站

return $_SERVER['REMOTE_ADDR'];

}

}

该函数中的正则表达式用来过滤内网IP地址,以避免获取到代理服务器的内网IP地址。至于这个正则表达式具体含义,不是本文主要讨论的内容,读者可以自行搜索了解。

现在,我们可以使用以下代码来测试上面的函数:

// 获取客户端IP地址

$ip = getClientIP();

// 输出客户端IP地址

echo "客户端IP地址:".$ip;

客户端IP地址的获取过程可能受到众多因素的影响,比如是否使用代理服务器,是否内网映射等等。因此,获取到的IP地址可能会存在误差。在实际代码中,需要根据具体场景进行调整,以获取到正确的IP地址。

后端开发标签