首页 > 代码编程 > 后端开发 > PHP > php 获取ip(如何使用 PHP 获取客户端 IP?)

php 获取ip(如何使用 PHP 获取客户端 IP?)

2023-11-13 PHP 37 ℃ 0 评论

使用 PHP 获取客户端 IP

在实际开发中,获取客户端 IP 地址是很常见的需求,比如对用户进行限制、记录操作日志等场景,都需要获取用户的 IP 地址。在 PHP 中获取客户端 IP 地址有多种方法,接下来我们将介绍常见的几种方式。

使用 REMOTE_ADDR 获取客户端 IP

PHP 的 $_SERVER 变量中包含了客户端请求相关的信息,其中 REMOTE_ADDR 就是客户端的 IP 地址。使用 REMOTE_ADDR 获取客户端 IP 的方式非常简单,可以直接使用以下代码:

if (!empty($_SERVER['REMOTE_ADDR'])) {

$client_ip = $_SERVER['REMOTE_ADDR'];

} else {

$client_ip = '';

}

代码中我们先判断 $_SERVER['REMOTE_ADDR'] 是否为空,如果不为空,就将其赋值给 $client_ip,否则将 $client_ip 赋值为空字符串。

需要注意的是,使用 REMOTE_ADDR 获取客户端 IP 地址的方式并不是绝对可靠的。因为 REMOTE_ADDR 是从 HTTP 请求头中获取的,我们的 IP 地址可能会被伪造。

使用 HTTP_X_FORWARDED_FOR 获取客户端 IP

另一种获取客户端 IP 地址的方式是使用 $_SERVER['HTTP_X_FORWARDED_FOR'] 变量。这个变量的值是一个以逗号分隔的 IP 地址列表,其中第一个 IP 地址就是客户端的真实 IP 地址。

if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {

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

} elseif (!empty($_SERVER['REMOTE_ADDR'])) {

$client_ip = $_SERVER['REMOTE_ADDR'];

} else {

$client_ip = '';

}

代码中,我们先尝试使用 HTTP_X_FORWARDED_FOR 获取客户端 IP 地址,如果该变量不为空,就将其值通过 explode(',') 分割成数组,取第一个元素作为客户端的真实 IP 地址。如果 HTTP_X_FORWARDED_FOR 为空,我们就使用 REMOTE_ADDR 获取客户端 IP 地址。如果 REMOTE_ADDR 也为空,将 $client_ip 赋值为空字符串。

需要注意的是,使用 HTTP_X_FORWARDED_FOR 获取客户端 IP 地址的方式也并不是绝对可靠的。因为如果我们的应用程序在 Web 服务器后面通过反向代理方式部署,HTTP_X_FORWARDED_FOR 可能会被伪造。

使用 REMOTE_HOST 获取客户端 IP

除了使用 REMOTE_ADDR 和 HTTP_X_FORWARDED_FOR 获取客户端 IP 地址外,我们还可以使用 $_SERVER['REMOTE_HOST'] 变量来获取客户端的主机名。该变量返回的是客户端主机名,如果无法解析,则返回客户端 IP 地址。

if (!empty($_SERVER['REMOTE_HOST'])) {

$client_ip = gethostbyname($_SERVER['REMOTE_HOST']);

} elseif (!empty($_SERVER['REMOTE_ADDR'])) {

$client_ip = $_SERVER['REMOTE_ADDR'];

} else {

$client_ip = '';

}

代码中,我们先尝试使用 REMOTE_HOST 获取客户端主机名,如果其值不为空,就调用 gethostbyname() 函数将主机名解析成 IP 地址。如果 REMOTE_HOST 为空,我们就使用 REMOTE_ADDR 获取客户端 IP 地址。如果 REMOTE_ADDR 也为空,将 $client_ip 赋值为空字符串。

需要注意的是,使用 REMOTE_HOST 获取客户端 IP 地址的方式依赖于 DNS 解析,解析失败的话,就无法正确获取客户端 IP 地址。

使用 HTTP_CLIENT_IP 获取客户端 IP

还有一种获取客户端 IP 地址的方式是使用 $_SERVER['HTTP_CLIENT_IP'] 变量。这个变量的值应该是客户端的 IP 地址,但是这个变量不是所有浏览器都支持,因此使用它需要谨慎。

if (!empty($_SERVER['HTTP_CLIENT_IP'])) {

$client_ip = $_SERVER['HTTP_CLIENT_IP'];

} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {

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

} elseif (!empty($_SERVER['REMOTE_ADDR'])) {

$client_ip = $_SERVER['REMOTE_ADDR'];

} else {

$client_ip = '';

}

代码中,我们先尝试使用 HTTP_CLIENT_IP 获取客户端 IP 地址,如果该变量不为空,就将其值赋值给 $client_ip。如果 HTTP_CLIENT_IP 为空,我们接着尝试使用 HTTP_X_FORWARDED_FOR 和 REMOTE_ADDR 获取客户端 IP 地址。如果这两个变量也为空,将 $client_ip 赋值为空字符串。

总结

获取客户端 IP 地址是开发中的一项基本任务,不同的方式都有其优缺点。我们需要根据实际情况选择最适合的方式,可以在项目中实现多种方式的支持,提供更加完善的服务。

炮渣日记