做的file_get_contents(」 http://api.hostip.info/country.php))一定會返回Web服務器的國家,而不是國訪客?
我們以前使用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
};
該解決方案,你必須在不同的國家,而不僅僅是美國的用戶做不同的事情的能力優勢,你不是靠調用第三方我們bsites/API的可能失敗
感謝您詳細的答覆。我認爲這個答案應該起作用。但是,由於我無法修改mysql(由於某些限制),所以我想嘗試使用'file_get_contents(「http://api.hostip.info/country.php?ip=」。$ _SERVER [「REMOTE_ADDR」]);'和你所建議的'get_real_ip'函數一起使用。你認爲它也會起作用嗎? –
是的,應該沒問題。由於您正在調用外部資源,您可能*要檢查file_get_contents()的結果是否爲假(使用===)。如果它返回false,您可以根據您無法確定訪問者是否在美國境內的事實提供額外的腳本。 – MrCarrot