【发布时间】:2021-02-11 06:19:50
【问题描述】:
我正在尝试编写一个 PHP 脚本以使用此函数获取客户端的 IP 地址:
public function getIpAddress() {
$ipAddress = '';
if (! empty($_SERVER['HTTP_CLIENT_IP']) && $this->isValidIpAddress($_SERVER['HTTP_CLIENT_IP'])) {
// check for shared ISP IP
$ipAddress = $_SERVER['HTTP_CLIENT_IP'];
} else if (! empty($_SERVER['HTTP_X_FORWARDED_FOR']) && $this->isValidIpAddress($_SERVER['HTTP_CLIENT_IP'])) {
// check for IPs passing through proxy servers
// check if multiple IP addresses are set and take the first one
$ipAddressList = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
foreach ($ipAddressList as $ip) {
if ($this->isValidIpAddress($ip)) {
$ipAddress = $ip;
break;
}
}
} else if (! empty($_SERVER['HTTP_X_FORWARDED']) && $this->isValidIpAddress($_SERVER['HTTP_X_FORWARDED'])) {
$ipAddress = $_SERVER['HTTP_X_FORWARDED'];
} else if (! empty($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']) && $this->isValidIpAddress($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'])) {
$ipAddress = $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
} else if (! empty($_SERVER['HTTP_FORWARDED_FOR']) && $this->isValidIpAddress($_SERVER['HTTP_FORWARDED_FOR'])) {
$ipAddress = $_SERVER['HTTP_FORWARDED_FOR'];
} else if (! empty($_SERVER['HTTP_FORWARDED']) && $this->isValidIpAddress($_SERVER['HTTP_FORWARDED'])) {
$ipAddress = $_SERVER['HTTP_FORWARDED'];
} else if (! empty($_SERVER['REMOTE_ADDR']) && $this->isValidIpAddress($_SERVER['REMOTE_ADDR'])) {
$ipAddress = $_SERVER['REMOTE_ADDR'];
}else{
$ipAddress = 'error';
}
return $ipAddress;
}
我尝试了很多次,它正在工作。但我尝试连接到 VPN,它检索到的是 IPv6 而不是 IPv4!
这可能是正常情况,但我需要获取该 PHP 脚本访问者的 IPv4。 我在谷歌上搜索了很多关于将 IPv6 转换为 IPv4 的信息,但我知道它无法转换。
但我注意到一些 IP 地理定位服务正在检索同一 VPN 的 IPv4(在同一设备上)!例如:canyouseeme.org 和 api.ipify.org。
也就是说,即使无法将 IPv6 转换为 IPv4,即使访问者使用的是 IPv6,也可以实现一种方法来获取 IPv4!
我的问题:
- 如果这两个版本之间无法转换,这些 IP 地理定位服务是如何检索访问者的 IPv4 的?
- 如果他们没有将 IPv6 转换为 IPv4。因此,他们直接检索 IPv4 而不接触 IPv6。但是,如果 $_SERVER 不包含 IPv4,他们是如何做到的?
除此之外,我注意到当我访问whatismyipaddress.com 时,他们首先检索了 IPv6,然后它开始在 IPv4 字段旁边加载,然后他们检索了它!
注意:所有这些网站都检索到相同的 IPv4。
谢谢。
【问题讨论】:
-
他们可能使用某种仅限 IPv4 的网络服务器来检索您的 IPv4。
-
@tkausl 那么,购买仅支持 IPv4 的网络服务器会是解决方案吗?
-
假设客户端没有IPV4地址?
-
所有的http头都很容易被欺骗,所以不要依赖它们。
-
与其为未来而战,不如修复您的应用程序使其也适用于 IPv6 不是更好吗?
标签: php ip ip-geolocation