我希望能够使用PHP在我的网站上检测访问者所在的国家/地区。
请注意,我不是试图将此作为安全措施或任何重要的事情,只是改变一些单词的拼写(美国人似乎相信单词“enrollment”有2个Ls ... 。疯狂的yanks),或许可以在“选择你的国家/地区”列表中提供默认选项。
因此,使用Geolocation数据库有点过头了,我真的不想为此安装新的PHP库,所以最简单/最简单的方法是什么访客来自哪个国家?
答案 0 :(得分:25)
PHP提供了一个自5.3.0以来的函数来将$ _SERVER [' HTTP_ACCEPT_LANGUAGE']变量解析为语言环境。
http://www.php.net/manual/en/locale.acceptfromhttp.php
$locale = Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
echo $locale; // returns "en_US"
答案 1 :(得分:21)
无法保证,但大多数浏览器会提交一个Accept-Language HTTP标头,如果他们来自美国,则会指定en-us。但是,一些较旧的浏览器只表示它们是en。并非所有机器都已正确设置以指示他们喜欢的区域设置。但这是一个很好的初步猜测。
英语 - 英国用户通常将他们的系统或用户区域设置为英语 - 英语,在默认浏览器配置中,应该将en-gb作为Accept Language标头。 (这个说明的早期版本;这是一个错字,抱歉。)其他国家也有en语言,如en-za(南非),并且,主要在理论上,像en-jp这样的组合也是可能的。
然而,基于地理IP的猜测在首选语言/语言环境中不太可能是正确的。 Google认为基于IP地址定位的内容协商是有道理的,当我在日本或韩国时,这真让我烦恼......
答案 2 :(得分:13)
您可以查看大多数浏览器将发送的HTTP_ACCEPT_LANGUAGE
标题(来自$ _SERVER)。
查看Zend_Locale的示例,或者您甚至可能想要使用lib。
答案 3 :(得分:6)
您可以进行一些IP比较,不用使用整个库来执行此操作。
使用API,这样就不需要你了。这是一个让您了解国家/地区的网络API:
Example: http://api.hostip.info/get_html.php?ip=12.215.42.19
Return : Country: UNITED STATES (US)
但是,您是否认为使用浏览器代理语言?你或许可以从中知道英语的类型。
这个名为BlockCountry的网站让您按国家/地区列出知识产权清单。当然,您不想阻止,但您可以使用IP列表并比较它们(获取所有美国IP ...)这可能不准确...
答案 4 :(得分:2)
鉴于您声明的目的,Accept-Language标头比基于IP的地理位置更合适。实际上,这正是Accept-Language的目的。
答案 5 :(得分:2)
解析$ _SERVER [“HTTP_ACCEPT_LANGUAGE”]以获取国家/地区和浏览器的区域设置
答案 6 :(得分:1)
为了识别您的访问者国家/地区,我使用了GeoIP扩展程序,非常简单易用。
答案 7 :(得分:1)
我使用HTTP_ACCEPT_LANGUAGE
$localePreferences = explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']);
if(is_array($localePreferences) && count($localePreferences) > 0) {
$browserLocale = $localePreferences[0];
$_SESSION['browser_locale'] = $browserLocale;
}
答案 8 :(得分:0)
我使用http://countries.nerd.dk服务进行IP到国家/地区的映射。它工作得很好,并且基于DNS,也很好地缓存。
如果您不想依赖外部服务,也可以下载供本地使用的数据库。
答案 9 :(得分:0)
GeoIP扩展是不错的选择。
答案 10 :(得分:0)
或者您可以执行以下操作:
从http://www.maxmind.com/app/geoip_country
下载'geoip.dat'和geoip.inc在geoip.inc标题中你会发现如何使用它(例如初始化和其余的......)
答案 11 :(得分:0)
有一件事是语言浏览者想要的,第二件事 - 你可以服务:
$SystemLocales = explode("\n", shell_exec('locale -a'));
$BrowserLocales = explode(",",str_replace("-","_",$_SERVER["HTTP_ACCEPT_LANGUAGE"])); // brosers use en-US, Linux uses en_US
for($i=0;$i<count($BrowserLocales);$i++) {
list($BrowserLocales[$i])=explode(";",$BrowserLocales[$i]); //trick for "en;q=0.8"
for($j=0;$j<count($SystemLocales);$j++) {
if ($BrowserLocales[$i]==substr($SystemLocales[$j],0,strlen($BrowserLocales[$i]))){
setlocale(LC_ALL, $SystemLocales[$j]);
break 2; // found and set, so no more check is needed
}
}
}
例如,矿井系统只提供服务:
我的浏览器语言是:pl,en-US,en =&gt;所以唯一正确的语言环境是pl_PL.UTF-8。
如果没有找到成功的比较 - 根本没有setlocale。