执行 file_get_contents(' http://api.hostip.info/country.php )) 肯定会返回网络服务器的国家,而不是访问者的国家?
我们曾经使用 IP2Nation,但最近发现它不准确,所以我们改用这个:
http://dev.maxmind.com/geoip/legacy/geolite/
在我们的实例中,我们以 CSV 格式下载了国家数据:http: //geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
然后我们将这些数据放入这样的mysql表中
CREATE TABLE `geoip` (`ipstart` int(10) unsigned NOT NULL, `ipend` int(10) unsigned NOT NULL, `code` char(2) NOT NULL, PRIMARY KEY (`ipstart`,`ipend`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `geoip` (`ipstart`, `ipend`, `code`) VALUES (16777216, 16777471, 'au'),
(16777472, 16778239, 'cn'),
(16778240, 16779263, 'au'),
etc...
$_SERVER["REMOTE_ADDR"] 并不总是返回正确的 IP 地址,例如,如果有人在代理后面。您可以使用此功能确定访问者的真实 IP 地址(尽可能)
function get_real_ip () {
if (!empty ($_SERVER['HTTP_X_FORWARDED_FOR'])) {
return $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif (!empty ($_SERVER['HTTP_CLIENT_IP'])) {
return $_SERVER['HTTP_CLIENT_IP'];
}
return !empty ($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';
}
然后您可以使用这样的 PHP 函数获取客户所在的国家/地区:
function get_country_by_ip ($ip) {
$ip = ip2long ($ip);
$sql = 'SELECT code FROM geoip WHERE ipstart <= ' . $ip . ' AND ipend >= ' . $ip . ' LIMIT 1';
// Get result of mysql query and return it here
}
所以你的最终代码是:
define ('COUNTRY_CODE_US', 'us');
if (get_country_by_ip (get_real_ip () == COUNTRY_CODE_US) {
// load script for US user;
} else {
// load script for users from other countries
};
此解决方案的优势在于您能够为不同国家的用户做不同的事情,而不仅仅是美国,而且您不依赖于调用可能会失败的第三方网站/API