如何追踪访问者的国家并将其重定向到适当的网站?

10
我想追踪访问者的国家,然后将他们重定向到我的站点的适当子域,就像Google所做的那样... 我可以依靠API的数据吗?如果我需要使用任何API,它能提供多少可靠性? 我正在使用PHP。

许多公司的互联网访问是通过一个国家,即使他们的员工在其他地方。 - mmmmmm
5个回答

18

下载并安装Maxmind的GeoLite Country数据库,声称准确率达到99.5%。您可以付费升级到声称准确率为99.8%的付费版本。关于如何从PHP使用数据库,有四个选项:

  1. 下载CSV文件并将其导入您选择的SQL数据库中。这是最慢的选项,并且具有丑陋的API。出于完整性考虑,我不建议使用它。
  2. 下载一个纯PHP类,该类可以读取数据库文件。这提供了比SQL选项更好的API,但仍然有点慢。有PHP4PHP5的版本。
  3. 下载并安装C扩展模块用于PHP。这样做的好处是拥有良好的接口和良好的性能。但是,它比纯PHP类更难安装,因此您可能需要向主机公司咨询。如果您很幸运,它可能已经安装好了。
  4. 如果您需要极快的性能,请选择Apache模块。这是最难安装的选项,但也是最快的选项。
所有这些选项都有获取国家代码的方法。我不会包括SQL选项,但你可以在这里获得更多信息。
纯PHP4:
include("geoip.inc");
$gi = geoip_open("/usr/local/share/GeoIP/GeoIP.dat",GEOIP_STANDARD);
$code = geoip_country_code_by_addr($gi, "24.24.24.24");

PECL PHP扩展:

$code = geoip_country_code_by_name($_SERVER['REMOTE_ADDR']);

Apache模块:

$code = apache_note("GEOIP_COUNTRY_CODE");

您可以根据这些代码进行重定向,使用HTTP重定向:

 $redirect = array("AU" => "http://australia.example.com", "NZ" => "http://newzealand.example.com")
 $url = $redirect[$code]
 header("Location: $url");

这会导致两个HTTP请求,因此效率不佳。更好的方法是使用Apache模块来进行重写,在你的.htaccess文件中:
GeoIPEnable On
GeoIPDBFile /path/to/GeoIP.dat

# Redirect one country
RewriteEngine on
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^CA
RewriteRule ^(.*)$ http://www.canada.com$1 [L]

# Redirect multiple countries to a single page
RewriteEngine on
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^(CA|US|MX)$
RewriteRule ^(.*)$ http://www.northamerica.com$1 [L]

当然,实现这一点可能更好的方法是让其他人在DNS层面上为您完成。快速搜索发现该公司(我不知道他们是否好),肯定还有其他选择。这就是谷歌如何做到的。

1
非常干净的答案。不需要参考其他地方...谢谢极客。 - Vijay

1

根据您想要将客户“世界”划分的粒度和可能目标(子域)的数量,您可以使用IP-to-country databaseMaxMind.com's Free Geolocation Database提供的数据,将其放入SQL表中,然后使用一个小脚本对访问者的IP地址进行查找并根据需要进行重定向。

这些数据永远不会100%准确,特别是如果您的任何访问者通过代理或其他匿名工具访问您的站点(在这种情况下,您看到的IP地址不是他们的真实地址)。如果您实施此功能,我建议允许用户更正(或简单地覆盖)区域重定向值得包括。


0

如果你不想自己编写代码,Evan有一个很酷的脚本叫做Lambda GeoIP!在这里查看:http://www.lambdageoip.com

Lambda GeoIP是一个完全自托管的地理定位脚本,您可以在您的网站上使用它来确定您的访问者的地理位置。除此之外,您还可以确定用户是否使用移动设备、机器人或卫星连接。

您还可以根据大洲、国家、地区或城市将用户转发到不同的页面。

所有功能都可以在您的网站上使用只需一行PHP代码。

Lambda GeoIP不会“打电话回家”,加载远程内容或与任何其他服务器通信。它是安全的,完全自托管的。


0

如果您不介意在服务器上下载、安装和保持最新的IP数据库,那么Fmark的解决方案在性能方面是最好的选择。 否则,您可以使用像www.redirectbycountry.com这样的重定向服务。


0

一种方法是使用您的服务提供商的IP地址,并使用JavaScript重定向,如下所示:

$.get("https://ipinfo.io", function(response) {
   if(response.country=="GB"){
      window.location.replace("http://stackoverflow.com");
   }
}, "jsonp");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接