通过 IP 区分不同国家的用户

Nov 3rd, 2011 Add Comment

为什么要在网站上通过 IP 区分来自不同国家用户? 这是为了让不同的国度和习惯的访客看到不一样的信息, 避免误导用户产生多余的交互行为或者因为页面的不合理而感到不爽.

通过 IP 判断用户所在地区, 区分显示广告

上图是最近我在顶部放置的广告 banner. 上方红色的是某网站圣诞节促销活动的 Affiliate 广告, 中国大陆之外地区的访客可以看到; 下方蓝色的是最新发布的与我同行 Apply App 应用广告, 只有中国大陆地区的访客可以看到.

区分访客国家有什么用?

这里是几个我利用该功能的例子.

区分网站功能
这个博客有翻译文章的功能, 这是为了方便海外访客阅读文章, 但对中国人显得十分多余. 所以我通过 IP 判断国家, 对中国大陆地区屏蔽翻译功能.

区分展示广告
我在网站侧边栏放有广告, 很多中文广告对海外流量来说毫无意义, 所以我进行区分展示. 中国大陆地区在侧边栏最下方看到的是拿福能的广告, 而其他地区看到的是 Google 的广告. hostucan 是我的一个广告主, 有英文网站, 也有中文网站, 所以我可以向他提供区分展示服务, 免得浪费流量.

屏蔽布点服务
海外有很多好的服务平台, 在网站上布点即可采集数据和分享文章. 但很不幸, 因为某些原因, 他们在国内展示效果并不好, 不但没有起到应有效果, 还让页面加载时间变长. 可以对大陆访客屏蔽这些布点.

在 PHP 通过 IP 区分国家

如何用 PHP 通过 IP 区分国家和地区呢? Maxmind.com 提供一套 GeoIP 的解决方案, 只需要简单几步即可在 PHP 中通过 IP 判断访客的国家.

1. 下载数据库和 PHP 库文件

2. 通过 PHP 代码获取国家信息
以下是一段示范代码, 演示如何获取国家代号和国家名称.

<?php
 
// 引入 PHP 库文件
include("geoip.inc");
 
// 打开本地数据库, 数据保存在 GeoIP 文件中.
$geoData = geoip_open('GeoIP.dat', GEOIP_STANDARD);
 
// 获取国家 IP
$countryCode = geoip_country_code_by_addr($geoData, $_SERVER['REMOTE_ADDR']);
 
// 获取国家名称
$countryName = geoip_country_name_by_addr($geoData, $_SERVER['REMOTE_ADDR']);
 
// 关闭本地数据库
geoip_close($geoData);
 
?>

在 WordPress 中通过 IP 区分国家

既然 PHP 上使用没问题, WordPress 肯定也是 Okay 的. 看看我是怎么使用的.

1. 放置数据库文件
将 GeoIP.dat 解压到 WordPress 根目录中. (你可以在这个目录找到 wp-config.php 或者 wp-config-sample.php 文件)

2. 编写调用接口
在主题目录中新建文件夹 include, 将 geoip.inc 放置在新建文件夹中. 并在该文件夹新建文件 geoip.php 文件内容如下.

<?php
 
include('geoip.inc');
 
global $countryCode;
 
$geoData = geoip_open('GeoIP.dat', GEOIP_STANDARD);
$countryCode = geoip_country_code_by_addr($geoData, $_SERVER['REMOTE_ADDR']);
geoip_close($geoData);
 
?>

这里只取国家代号作为判别依据. 并且国家代号是全局变量, 以避免页面多处判断需要反复访问 GeoIP.dat 获取信息, 减少程序开销.

2. 调用接口, 获取国家代号
3. 打开 header.php 文件, 在文件顶部加入代码如下.

<?php include('include/geoip.php'); ?>

4. 使用国家代号
在主题中调用代码, 例子如下.

<?php
 
global $countryCode;
 
if($countryCode == 'CN') {
	// 中国大陆地区执行的代码
} else if($countryCode == 'US') {
	// 美国地区执行的代码
} else {
	// 中国大陆和美国以外地区执行的代码
}
 
?>

总结

通过 IP 判断访客来源十分精准的, 现在一些外贸网站都是通过这个方法向用户进行展示区分, 比如美国地区的用户默认看到美国能买到的商品和美国物流信息. 但不是百分之百的准确, 比如某人常年翻墙, 那他可能一直看不到本国的信息. 至于是否需要区分处理, 网站主要有所考虑.

可能有人会问, 加这么个东西, 性能如何? 会不会要求强大的服务器? 我测试过, 正常的服务器上几乎不影响页面加载性能, 可以看看这个博客的速度. 如果不放心, 自己测一下.

声明: 本文采用 BY-NC-SA 协议进行授权. 转载请注明转自: 通过 IP 区分不同国家的用户

  1. http://1.gravatar.com/avatar/f7934f5aa712a15c3c793eaf68737d89?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @虎皮鲨
    我也被骗了~哈哈~

  2. http://0.gravatar.com/avatar/04b3e9066e014db0dddf939aec19b7a0?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    有国家的数据,不知道有没有通过ip判断全球各个地区的数据,就像google analytics里那样

  3. http://1.gravatar.com/avatar/b095aac30e9f3918ade2c87100c10744?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    意义不是很大。。

  4. http://1.gravatar.com/avatar/3175983cfe04c4e9ba7a36140079d0bf?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    原来那个蓝色的是广告啊!!

  5. http://1.gravatar.com/avatar/ffa60157af668384f5325116efd02385?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @mg12
    JS我会,可是PHP不知道怎么写...而且PHP写的话是在服务器端执行的服务器在国外肯定不会失败的吧...

  6. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @Thomas
    如果只是视频, 我有个更好的建议. 加载 Youtube 的 Logo 并用 JavaScript 判断, 如果加载成功则加载 Youtube, 否则加载国内视频, 动态注入视频.

    @Leeiio
    可以啊. 加载 Youtube 或者 Facebook 文件, 失败说明在墙外. 公司的网站就这么干的.

  7. http://1.gravatar.com/avatar/ffa60157af668384f5325116efd02385?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    要是可以根据墙内墙外就好了...

  8. http://0.gravatar.com/avatar/2f80c13731d3b0e0e621b3826dffab6f?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    谢谢LZ的方法:)
    自己博客贴视频不怕国内看不到Youtube了。中国IP用国内视频站,国外用Youtube

  9. http://1.gravatar.com/avatar/f7b32d696563754fa0e7fdfc4d96485b?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    很多广告管理程序都自带了这个功能

  10. http://0.gravatar.com/avatar/2667e3794c00b147ea9cda10b88365ae?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    嗯。对于区分广告是最好的。

  11. http://1.gravatar.com/avatar/313d0583bfc8ccc7bebd7594f8497177?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    哈哈,已经使用了,不错

  12. http://0.gravatar.com/avatar/04f8310aa84a17510d8613edc9455703?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    博主很有想法啊

  13. http://1.gravatar.com/avatar/3f6f95fb9a3a226a5025dc961e3957d3?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    想用这个做各天气预报

  14. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @hanolex博客
    那不一定, Google 广告是根据用户 location 投放的. 自己的网站可以用这个来搞.

  15. http://0.gravatar.com/avatar/8b58ab5c0407a4daa1d179028686f72a?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    很好的功能,登录一些西班牙网站时会出现中文广告应该也是这个道理

  16. http://1.gravatar.com/avatar/55b3be0338063df669543bd9df300cc6?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    不错了 学习了

  17. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @Showfom
    如果有多国访客, 而没有多语言站, 这算一种这种方法. 我也想着什么时候将多语言站做成静态化, 估计流量还会暴涨, 但想清楚以前, 这样做总比之前效果好. 这个判别国家的程序很好用, 耗时就 30 毫秒左右.

    @bolo
    也是一个好方法哈, 不过只能用 JavaScript 了.

  18. http://0.gravatar.com/avatar/2a9c4f525050372a6fe0b10ce4fe8957?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    这点子不错,但如果我来做的话我会通过google jsapi里的地址信息来判断,降低服务器压力

  19. http://0.gravatar.com/avatar/8406d089bc81b664a2610b8d214c1428?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    这玩意交给php做太浪费资源了,用dns就行,比如dnspod,国内的设置好一个服务器的解析,国外用户设置好另一个解析,搞定⋯⋯

  20. http://1.gravatar.com/avatar/b4619e0a98a8d63a20477bf351d37f21?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    应该是外贸网站适用,普通的话看统计也可以。

  21. http://1.gravatar.com/avatar/f60bdb4a5fd247895f156a97a19353c6?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    这个思路对外贸站和英文站很有实际意义呀,而且用代码还能减少WP的插件,我也在我站上试试看!

  22. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @Alonesky
    嗯, 某人正在做一个通过分类区分广告的插件, 到时候你可以用一下看看效果. 哈~

    @bgg
    这是就是网站策略问题了. 如果你的博客 98% 都是中国访客, 那大可不必考虑这个问题.

  23. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @iplaywind
    抱歉, 我写错了, 是 wp-config.php 文件. 我立即改一下.

  24. http://1.gravatar.com/avatar/11a4aa0c7077a6d2c1387f038cd241df?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    在 WordPress 中通过 IP 区分国家中的第一步“放置数据库文件”,在WordPress根目录下好像没有wp-content.php 文件哦,WordPress安装包里面也没有wp-content.php 文件,还请核实,谢谢。

  25. http://0.gravatar.com/avatar/a2978e50625419f92a0a0d0f87cee8e8?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    这是很不错的思路,适合有多国人士访问的站点。不错~

  26. http://0.gravatar.com/avatar/25b72286083d5fc406cc16818318d264?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    这个给力,有空也折腾一下,谢谢分享。

  27. http://0.gravatar.com/avatar/68546ae29ab85174f8e8a1655122938b?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    那广告怎么区分国家投放呢?这个是个问题

  28. http://0.gravatar.com/avatar/2dc2cd16bec6dcd2c84df67667045bda?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    对个人博客来说 广告分类应该是主要的应用方向

  29. http://0.gravatar.com/avatar/08d22413e0856a33f2d6478a6380f20b?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    我之前就比较关注你的网站,还看过你们几个设计搞了一个卖主题的网站,现在卢松松把你的博客弄在他的首页,看样子,你的博客不火都难啊现在!

  30. http://0.gravatar.com/avatar/2667e3794c00b147ea9cda10b88365ae?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    博客用途应该不多吧。

  31. http://0.gravatar.com/avatar/e41d06048fe9d04f0811c966842abcd6?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    病成那样还发文章,不要命了。。。

  32. http://0.gravatar.com/avatar/253b4007557539ce0e443809f108017c?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    最近你的主题改的不少,连首页文章内容ajax调用都去掉了不知为何?不用jquery了?

  33. http://0.gravatar.com/avatar/8aa97fe8ca30db7b8b4c992f013736bf?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    我看到了+1按钮,还点了一下。

  34. http://0.gravatar.com/avatar/8aa97fe8ca30db7b8b4c992f013736bf?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    这个不错,收藏了。楼主好东西!

  35. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @秦天SEO
    因为有人习惯 Ctrl + Enter 换行, 毕竟不是人人都用 QQ 的.
    告诉你名字有 SEO 这个词会被屏蔽你还来... (WordPress 没白名单)

  36. http://1.gravatar.com/avatar/7864d250ba3b93e42b4f68259881440b?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    哈哈,不错!博主有很多好的东西,一直在学习,非常感谢!为什么不支持ctrl+enter回复呢?

  37. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @卢松松
    哈哈, 用途应该比较很的, 就怕想不出来. 比如大陆的房地产网站, 识别出来是香港人在浏览, 则显示大批投资性房产信息.

  38. http://0.gravatar.com/avatar/49ca679cb38873e4d6fa159c4768a53e?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    看来比较适合外贸网站

  1. Loading...