如何仅将特定PHP限制为美国IP

时间:2013-09-20 14:22:12

标签: php

我想知道,如果用户在美国,是否有可能只通过PHP执行特定的PHP行。我希望为美国订单包含超过100美元的免费送货图片,但如果用户是加拿大人,我希望不会出现这种情况。

以下是我正在使用的内容。

  <?php
            if ($_product->getPrice() > 100)
{
echo '<span class="shippinginfo">Free Shipping</span>';
}    
else
{
    echo '<span class="shippinginfo">Flat Rate $5.95</span>';
}
?>

3 个答案:

答案 0 :(得分:1)

有两种方法可以做到这一点, 1.使用客户端ips过滤位置,

$deny = array("111.111.111", "222.222.222", "333.333.333");
if (in_array ($_SERVER['REMOTE_ADDR'], $deny)) {

如果客户端使用VPN或代理服务器访问您的应用程序,则会失败,

  1. 使用java脚本查找客户端位置,并将纬度和经度值传递给服务器,使用PHP查找客户端的地理位置,
  2. 如果未启用客户端浏览器/允许位置信息,则会失败。

    function getLocation()
      {
      if (navigator.geolocation)
        {
        navigator.geolocation.getCurrentPosition(showPosition);
        }
      else{x.innerHTML="Geolocation is not supported by this browser.";}
      }
    function showPosition(position)
      {
      x.innerHTML="Latitude: " + position.coords.latitude + 
      "<br>Longitude: " + position.coords.longitude; 
      }
    

答案 1 :(得分:0)

您需要拥有世界上所有ISP的数据库(包含数千个IP),或者您需要使用http://ipinfodb.com/ip_location_api.php

等API

另外,请记住,通过使用Web代理,HTTP代理或VPN伪造IP非常容易。 您不能只信任IP。

对于代码部分,请阅读他们的文档,一旦获得他们的国家/地区($country),请执行此操作(如果我理解正确的话):

<?php  
// ...
if($country != 'us') {
    if($_product->getPrice() > 100) {
        echo '<span class="shippinginfo">Free Shipping</span>';
    } else {
        echo '<span class="shippinginfo">Flat Rate $5.95</span>';
    }
}
// ..
?>

我建议使用API​​,但是如果你想要挑战(或者如果你真的有很多的流量),你可以下载一个数据库,例如{{3并自己进行IP到国家/地区的转换。请记住,即使用户似乎拥有美国IP,您也绝不会100%确定用户来自美国。

答案 2 :(得分:0)

您需要一个GeoIP数据库。有一大堆可用 - 这里是one result I got from google,但还有很多其他的;找到一个最适合你的(有些是免费的,有些是你需要付费的;有些只有国家数据,有些有城镇数据;有些是在线API,有些是可下载的数据库;有些是比其他更新的;等等。)

您将遇到的问题是:

  • 保持数据最新 - IP地址不依赖于给定位置。数据库依赖于有关每个地址块的所有权的数据,以及该所有者(即本地ISP)正在使用它的位置。 IP地址确实会经常更改所有权和位置,如果您不及时更新,数据库将很快开始提供错误的结果。即使是最新的DB也可能是错的; IP的位置未正式发布,因此数据库维护人员必须手动关注更改。他们错过了一些并不罕见。

  • 通过VPN或使用代理服务器进行连接的用户将收到错误的结果。你无能为力:你必须接受当你的IP地址出现在其他地方时可能在一个地方。

以上信息是您可以这样做,但不能保证是正确的,所以请使用它,但不要依赖它

因此,您应该为您的用户提供一种解决方法并手动指定其国家/地区的方式。