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

Php 地理过滤以提供基于位置的内容,php,json,Php,Json,我希望提供基于位置的内容,即我希望仅允许位于亚利桑那州的用户查看我页面上显示的视频。但是亚利桑那州以外的用户也可以查看该页面。我正在使用web服务根据用户的IP地址确定用户的位置 这是网页中嵌入的代码 <?php require_once("geofilter.php"); ?> <?php if (getRegion()=="Arizona") //if (getCity()=="Tempe" || getCity()=="Chandler") { ?> <ifr

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

?>

您是否不需要以某种方式将客户端的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数据库来执行这些查找。看一看类似的内容,以获得更好的选项:。Maxmind甚至提供了Apache模块,可以在
$\u服务器
superglobal中公开GeoIP信息。

u可以尝试对Geofilter.php使用类Geofilter(例如,类Geofilter{将Geofilter.php文件的所有内容放在这里})。然后创建Geofilter类的对象$obj=newgeofilter();最后检查一下($obj->getRegion()==“Arizona”){…}。嘿,迈克,你发现了我面临的错误,我执行了你的建议,但我得到了一个私人IP地址,因此我无法从中获得任何与位置相关的信息。