地理过滤以提供基于位置的内容

时间:2014-05-23 18:15:59

标签: php json

我希望提供基于位置的内容,即我希望仅允许位于亚利桑那州的用户查看我页面上显示的视频。但是,亚利桑那州以外的用户也可以查看该页面。我正在使用http://freegeoip.net Web服务从其IP地址确定用户位置。

这是网页中嵌入的代码

<?php require_once("geofilter.php"); ?>
<?php
if (getRegion()=="Arizona")
//if (getCity()=="Tempe" || getCity()=="Chandler")
{
?>
<iframe src = 'videourl' height='415' width='615' align='top' scrolling='no' frameborder='0'></iframe>
<?php
} else
{
?>
<h1 style="color:#F00">This page is not available in your region: <?php echo (getCity().", ".getRegion());?></h1>
<?php }?>

这是geofilter.php的代码

<?php               
function getCountry()
{
$pageContent = file_get_contents('http://freegeoip.net/json/');
$parsedJsonCountry  = json_decode($pageContent);
return htmlspecialchars($parsedJsonCountry->country_name);
}

function getRegion()
{
$pageContent = file_get_contents('http://freegeoip.net/json/');
$parsedJsonRegion  = json_decode($pageContent);
return htmlspecialchars($parsedJsonRegion->region_name);
}

function getCity()
{
$pageContent = file_get_contents('http://freegeoip.net/json/');
$parsedJsonCity  = json_decode($pageContent);
return htmlspecialchars($parsedJsonCity->city);
}

function getZipCode()
{
$pageContent = file_get_contents('http://freegeoip.net/json/');
$parsedJsonZip  = json_decode($pageContent);
return htmlspecialchars($parsedJsonZip->zipcode);
}

function getIpAddress()
{
$pageContent = file_get_contents('http://freegeoip.net/json/');
$parsedJsonIp  = json_decode($pageContent);
return htmlspecialchars($parsedJsonIp->ip);
}

?>

1 个答案:

答案 0 :(得分:2)

您是否需要以某种方式将客户端的IP地址传递给此服务?从它的外观来看,您只是从服务器调用一个远程端点,它不会传递客户端信息,只会提供服务器的IP地址。

我原本认为,即使是非常基本的调试,也会显示每次从服务器端向服务端点发出的呼叫都会得到相同的结果。

此外,该代码的结构非常糟糕。没有理由为每个国家,地区等确定此服务。只需预先拨打电话并存储所有Geoip确定信息。

所以这是我的建议:

$client_ip_address = $_SERVER['REMOTE_ADDR']; // or however you get client IP
$geoip_json = file_get_contents('http://freegeoip.net/json/' . $client_ip_address);
$geoip = json_decode($geoip_json);
// you now have geoip object you can work directly with
// no need for a bunch of function wrappers
// example
// $country_name = $geoip->country_name;

if ($geoip->region_code === 'AZ') {
    // do whatever
}

最后,正在做一个远程服务电话,你真的想做什么?如果您不期望大量流量或担心加载页面所花费的时间可能没问题,但是,您没有理由不能使用本地GeoIP数据库来执行这些查找。看看这样的东西,以获得更好的选择:https://github.com/maxmind/。 Maxmind甚至提供了Apache模块,它们可以在$_SERVER超全局中公开GeoIP信息。