接下来我将为大家详细讲解“PHP 获取ip地址代码汇总”的完整攻略。
1. 获取客户端IP地址的常用方法
1.1. 使用$_SERVER数组获取
PHP中可以使用$_SERVER
超全局变量获取客户端IP地址。其中,$_SERVER['REMOTE_ADDR']
是最基本的获取IP地址的方式。
<?php
$ip = $_SERVER['REMOTE_ADDR'];
echo $ip;
?>
1.2. 优先考虑X-Forwarded-For头部
考虑到某些代理服务器会利用X-Forwarded-For头部记录客户端真实IP地址,因此获取客户端IP地址时应首先尝试获取X-Forwarded-For头部中的IP地址。
<?php
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip_arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$ip = trim($ip_arr[0]);
} elseif(isset($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
echo $ip;
?>
1.3. 使用代理时要加判断
如果你的网站部署在代理服务器之后,那么上面的代码就不能正常工作了。因此,我们需要判断当前请求是否是代理服务器发出的。
<?php
if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
if(strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',') !== false) {
$ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$ip = trim(end($ips));
}else{
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
}elseif(isset($_SERVER['HTTP_CLIENT_IP']) && !empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
}else{
$ip = $_SERVER['REMOTE_ADDR'];
}
// 如果是内网地址,则获取本机的IP地址
if(substr($ip,0,7) == "192.168" || substr($ip,0,7) == "172.16" || substr($ip,0,8) == "10.0.0."){
$ip = file_get_contents("http://ipecho.net/plain");
}
echo $ip;
?>
2. 解析IP地址获取详细信息
2.1. 使用淘宝IP库
淘宝提供了一个IP地址查询的API,可以通过访问以下URL解析IP地址对应的详细信息。
http://ip.taobao.com/service/getIpInfo.php?ip=202.103.26.16
解析结果会以JSON格式返回。我们可以使用PHP的json_decode()
函数将其转换为数组,然后使用数组下标获取相应信息即可。
以下是示例代码:
<?php
$ip = $_SERVER['REMOTE_ADDR'];
$url = "http://ip.taobao.com/service/getIpInfo.php?ip=".$ip;
$response = file_get_contents($url);
$info = json_decode($response,true);
if($info['code'] == 0) { // 查询成功
echo $info['data']['country'].$info['data']['region'].$info['data']['city'];
}else{
echo '查询失败';
}
?>
2.2. 使用GeoIP库
GeoIP库是一个流行的IP地址解析库,它可以解析IP地址对应的国家、地区、城市以及经纬度等信息。
以下是GeoIP库的示例代码:
<?php
$ip = $_SERVER['REMOTE_ADDR'];
$database = dirname(__FILE__).'/GeoIP.dat'; // GeoIP库的位置
if (!file_exists($database)) {
die('GeoIP database not found');
}
require_once 'geoip.inc';
// 初始化GeoIP
$gi = geoip_open($database, GEOIP_STANDARD);
// 解析IP地址
$record = geoip_record_by_addr($gi, $ip);
// 输出详细信息
echo $record->country_name.' - '.$record->city.' - '.$record->latitude.','.$record->longitude;
// 关闭GeoIP
geoip_close($gi);
?>
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP 获取ip地址代码汇总 - Python技术站