请求地理位置信息服务器进行检查,返回 IP 所在位置(主机、州、国家、城镇)。
<?php
$ip='94.219.40.96';
print_r(geoCheckIP($ip));
//Array ( [domain] => dslb-094-219-040-096.pools.arcor-ip.net [country] => DE - Germany [state] => Hessen [town] => Erzhausen )
//Get an array with geoip-infodata
function geoCheckIP($ip)
{
//check, if the provided ip is valid
if(!filter_var($ip, FILTER_VALIDATE_IP))
{
throw new InvalidArgumentException("IP is not valid");
}
//contact ip-server
$response=@file_get_contents('http://www.netip.de/search?query='.$ip);
if (empty($response))
{
throw new InvalidArgumentException("Error contacting Geo-IP-Server");
}
//Array containing all regex-patterns necessary to extract ip-geoinfo from page
$patterns=array();
$patterns["domain"] = '#Domain: (.*?) #i';
$patterns["country"] = '#Country: (.*?) #i';
$patterns["state"] = '#State/Region: (.*?)<br#i';
$patterns["town"] = '#City: (.*?)<br#i';
//Array where results will be stored
$ipInfo=array();
//check response from ipserver for above patterns
foreach ($patterns as $key => $pattern)
{
//store the result in array
$ipInfo[$key] = preg_match($pattern,$response,$value) && !empty($value[1]) ? $value[1] : 'not found';
}
return $ipInfo;
}
?>
您还应考虑缓存结果,因为它会大大加快速度。
对于流量较小的网站来说,这不成问题,但如果您希望网站发展壮大,您现在就必须考虑这个问题。您还应该考虑您依赖网站正常运行并以特定方式返回数据,因此正则表达式在将来可能会过时或失效。
只是一些需要考虑的事项。
我真的很需要这个,谢谢!
使用此方法获取用户 IP 地址的最佳方法是什么?
$_SERVER[‘REMOTE_ADDR’]
因此,您可以像这样调用函数
$ip=$_SERVER[‘REMOTE_ADDR’];
geoCheckIP($ip);
我希望六个月前就看到这个… 它非常有效!我现在要在很多网站上使用它!
我一直在尝试,认为这可能也很有用… 它允许您根据用户的地理位置重定向或回显一个愚蠢的语句
$my_array=geoCheckIP($ip);
foreach ($my_array as $key => $value){
if($key=='country'){
#根据国家切换
switch ($value) {
case 'GB - United Kingdom'
echo "您来自英国!我们喜欢英国人!";
break;
case 'NZ - New Zealand'
echo "您来自新西兰。南半球的天气怎么样?";
break;
case 'US - United States'
echo "您来自美国。在美国生活一定很不错。我真想去,但我太害怕了!";
break;
case 'CA - Canada'
echo "您来自加拿大。下雪了吗?";
break;
case 'AU - Australia'
echo "您来自澳大利亚。您的头部会充血吗?";
break;
}
echo '
'.$key.': '.$value;
}
}
酷 - 我需要这个,这样某些州(除了内布拉斯加州)才能看到某些页面。
在这种情况下,整个脚本会是什么样子?
例如
如果您在内布拉斯加州 - 它会重定向到 URL A
如果不在内布拉斯加州 - 它会重定向到 URL B
谢谢 - ryan
大家好,
这是从 IP 自动获取区域的公式的第一部分。
在我的 Wufoo 表单中,我目前有一个区域下拉菜单,它是必需的。我们能否使用此方法的某种变体(可能通过 URL 修改),将区域响应转储到隐藏的 Wufoo 字段中?
谢谢!!
Matalin
感谢您分享这个很棒的内容,我需要这个,它对检测用户的真实 IP 和位置非常有帮助,因为在过去几天里,我一直在面临一些垃圾邮件发送者。
http://www.gysms.com
如果他们是垃圾邮件发送者,为什么你要把他们的地址放在这个网站上?
如果您是开发人员,您应该知道您正在为他们提供一些反向链接,这真的不聪明…
整洁且功能齐全……有人知道如何使用它根据用户位置显示帖子吗?例如:一个事件列表网站显示用户所在位置的事件。
谢谢
这很酷,但我认为我永远不会在生产服务器上使用它,因为它依赖于第三方。如果 netip.de 突然关闭会发生什么?
嗨,伙计,我想创建我自己的 URL 短链服务。该怎么做?
嗨,状态模式出现了“未找到”错误。请帮忙…
在使用 WordPress 平台创建网站时,我也遇到了“未找到”属性。
Array ( [domain] => localhost [country] => – [state] => not found [town] => not found )
有帮助吗???
嘿,不要在本地主机上使用这段代码…
他用静态数字编写了 $ip,而不是 $ip=$_SERVER[‘REMOTE_ADDR’];
因为在那里不起作用
谢谢
不错,我们也一直在使用类似的东西… 对于所有担心依赖第三方网络服务的人来说,我认为关键是要使其与任何特定服务分离,以便您可以在需要时轻松切换到其他服务;例如,这个 Drupal 模块做得非常好: https://drupal.org/project/smart_ip
感谢您分享这个很棒的内容,我需要这个,它对检测用户的真实 IP 和位置非常有帮助,因为在过去几天里,我一直在面临一些垃圾邮件发送者。
http://ipinfo.io/ 更加精确。并且使用 PHP 或 AJAX 非常容易使用。
查看开发者信息: http://ipinfo.io/developers
function getRealIpAddr()
{
if (!empty($_SERVER[‘HTTP_CLIENT_IP’])) //检查来自共享网络的 IP
{
$ip=$_SERVER[‘HTTP_CLIENT_IP’];
}
elseif (!empty($_SERVER[‘HTTP_X_FORWARDED_FOR’])) //检查 IP 是否通过代理传递
{
$ip=$_SERVER[‘HTTP_X_FORWARDED_FOR’];
}
else
{
$ip=$_SERVER[‘REMOTE_ADDR’];
}
return $ip;
}
function get_ip_address() {
// 检查共享网络/ISP IP
if (!empty($_SERVER[‘HTTP_CLIENT_IP’]) && validate_ip($_SERVER[‘HTTP_CLIENT_IP’])) {
return $_SERVER[‘HTTP_CLIENT_IP’];
}
}
function validate_ip($ip)
{
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) === false) {
return false;
}
return true;
}
截至 2020 年 6 月 1 日,此方法不再有效。