首页 > 解决方案 > 如何使用php获取访问者的IP地址

问题描述

我想获取我的用户的位置,但我不想使用第三方系统来做到这一点
所以我制作了这个脚本

    <?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 ,并且无法从中获取我的访问者位置
我的问题是

  1. 192.168.xxx.xxx 是真的不能用来确定用户的位置吗
  2. 如果上面的脚本无法获取用户位置,那么我该怎么做
    只是为了清楚我只想要他们的IP地址,因为我需要第三方服务将他们的 IP 地址更改为一个位置,所以我认为最好离开它是一个数字

目前在我的页面上编辑
它告诉我 192.168.43.104 但如果我用谷歌搜索“我的 ip”,我会197.210.85.238 Your public IP address从我的公共 ipaddress 中获得我的位置

标签: phpgeolocationlocationip

解决方案


您的服务器只能在您通过 WAN(又名公共互联网)访问它时了解您的公共 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 为专用网络保留的 IPv4 地址,它们应该只在路由器后面使用。并且任何路由器都可以免费使用它们(因此它在定位用户地理位置方面没有任何意义)。

由于您仅通过局域网 (LAN) 访问该服务器,因此您的流量根本没有通过公共互联网路由。本地网络流量不包含您要求的公共 IP 信息。

简而言之,请将您的应用程序放在公共服务器上以正确测试您的代码

PS 正如其他人所指出的,geoip 数据永远不会 100% 准确。如果您决定仅根据 IP 确定用户位置,您需要接受您的结果不准确。


推荐阅读