【问题标题】:geofiltering to provide location based content地理过滤以提供基于位置的内容
【发布时间】:2014-05-23 18:15:59
【问题描述】:

我希望提供基于位置的内容,即我希望仅允许位于亚利桑那州的用户查看我页面上显示的视频。但是,亚利桑那州以外的用户也可以查看该页面。我正在使用http://freegeoip.net 网络服务从他们的 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);
}

?>

【问题讨论】:

  • 你可以尝试对geofilter.php 使用Geofilter 类(例如,Geofilter 类{将geofilter.php 文件的所有内容放在这里})。然后将 Geofilter 类的对象创建为 $obj = new Geofilter();最后通过 if($obj->getRegion()=="Arizona"){...} 检查。

标签: php json


【解决方案1】:

您不需要以某种方式将客户端的 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 superglobal 中公开 GeoIP 信息的效果。

【讨论】:

  • 嘿,迈克,你发现了我所面临的错误我实施了你的建议,但我得到了一个私人 IP 地址,因此我无法从中获取任何与位置相关的信息。
猜你喜欢
  • 2019-07-22
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多