问题描述
我想获取用户的位置,但是我不想使用第三方系统来实现此目的
所以我做了这个脚本
<?PHP
function getIPAddress() {
//whether ip is from the share internet
if(!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
}
//whether ip is from the proxy
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
//whether ip is from the remote address
else{
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}
$ip = getIPAddress();
echo $ip;
?>
当我转到http:// localhost时,它回显:: 1,然后当我连接到互联网并转到http://192.168.43.104时,它回显192.168.43.104,我在网上看到192.168.xxx.xxx是一个公共IP,并且有数百万用户在使用192.168.xxx.xxx,并且无法从该地址获取我的访客位置
我的问题是
- 确实不能使用192.168.xxx.xxx来确定用户位置
- 如果上述脚本无法获取用户位置,那我该怎么办
需要说明的是,我只需要他们的 IP 地址,因为我需要第三方服务才能将其ip地址更改为位置,所以我认为最好将其保留为数字
编辑
当前在我的页面上,它告诉我192.168.43.104,但是如果我在Google上搜索“我的IP”,我是否可以从我的公共IP地址获取197.210.85.238 Your public IP address
解决方法
您的服务器仅在通过WAN(也称为公共互联网)访问公共IP时才能学习您的公共IP。
如果您使用如下所示的IP访问服务器:
- 10.0.0.0 – 10.255.255.255
- 172.16.0.0 – 172.31.255.255
- 192.168.0.0 – 192.168.255.255
请注意,它们是IANA为private networks保留的IPv4地址,应该仅在路由器后面使用。而且任何路由器都可以自由使用它们(因此对定位用户地理位置没有任何意义)。
由于您仅通过局域网(LAN)访问该服务器,因此您的流量根本没有通过公用Internet路由。本地网络流量将不包含您所要求的公共IP信息。
简而言之,请将您的应用程序放在公共服务器上以正确测试您的代码。
P.S。正如其他人指出的那样,geoip数据永远不会100%准确。如果您决定仅基于IP确定用户位置,则需要接受结果不准确。
,让我回答您的两个问题。
- 确实不能使用192.168.xxx.xxx来确定用户位置
是的,这是一个私有IP地址范围。 IP地理位置服务(例如IP2Location)仅在公共IP地址范围内起作用。
- 如果以上脚本无法获取用户位置,那我该怎么办。需要说明的是,我只需要他们的IP地址,因为我需要第三方服务才能将其IP地址更改为某个位置,所以我认为最好将其保留为数字
问题不是您的脚本。一个简单的$ _SERVER ['REMOTE_ADDR'];在大多数情况下,应该会获得您的访客IP地址。但是,您需要在WAN(而不是LAN)中进行测试。例如,您将页面放在数据中心的服务器中,并可以从办公室的另一个网络访问它。