假设您需要知道访问您网站的用户的国家/地区,因为您有一个国际化网站,并且会根据该国家/地区显示不同的内容。您可以询问用户。您可能希望无论如何都具有该功能,以确保您的访问者能够控制,但他们肯定会很乐意在您的能力范围内,直接获得正确的信息。
没有本机 Web 技术具有此信息。JavaScript 具有地理定位功能,但用户需要批准,即使这样,您也需要使用一些库将坐标转换为更实用的国家/地区。即使后端语言能够访问 JavaScript 无法访问的 IP 地址,也不能自动知道源国家/地区。
加拿大。我只想知道他们是否来自加拿大。
您需要询问知道此信息的某种服务。The IP 地理定位 API 就是这样的服务,而且它是免费的。
您对 API 执行 GET 操作。如果您想测试它,可以在浏览器中直接执行。
https://api.ipgeolocationapi.com/geolocate/184.149.48.32
但您获得的不仅仅是国家/地区。您还会获得可能需要使用的大量信息。我碰巧坐在加拿大,这是我关于我的 IP 地址的信息
{
"continent":"North America",
"address_format":"{{recipient}}\n{{street}}\n{{city}} {{region_short}} {{postalcode}}\n{{country}}",
"alpha2":"CA",
"alpha3":"CAN",
"country_code":"1",
"international_prefix":"011",
"ioc":"CAN",
"gec":"CA",
"name":"Canada",
"national_destination_code_lengths":[
3
],
"national_number_lengths":[
10
],
"national_prefix":"1",
"number":"124",
"region":"Americas",
"subregion":"Northern America",
"world_region":"AMER",
"un_locode":"CA",
"nationality":"Canadian",
"postal_code":true,
"unofficial_names":[
"Canada",
"Kanada",
"Canadá",
"カナダ"
],
"languages_official":[
"en",
"fr"
],
"languages_spoken":[
"en",
"fr"
],
"geo":{
"latitude":56.130366,
"latitude_dec":"62.832908630371094",
"longitude":-106.346771,
"longitude_dec":"-95.91332244873047",
"max_latitude":83.6381,
"max_longitude":-50.9766,
"min_latitude":41.6765559,
"min_longitude":-141.00187,
"bounds":{
"northeast":{
"lat":83.6381,
"lng":-50.9766
},
"southwest":{
"lat":41.6765559,
"lng":-141.00187
}
}
},
"currency_code":"CAD",
"start_of_week":"sunday"
}
有了这些信息,我可以轻松决定将用户重定向到我的网站的加拿大版本(如果有),或者以加元显示价格,或者提供法语翻译,或者是我能想到的任何其他事情。
假设您使用的是 PHP。您可以获取 IP 就像这样...
function getUserIpAddr() {
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}
获取信息的 cURL
$url = "https://api.ipgeolocationapi.com/geolocate/184.149.48.32";
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
$result = curl_exec($ch);
它以 JSON 格式返回,因此
$json = json_decode($result);
然后 $json->{'name'};
如果我在加拿大,则将是“加拿大”。
所以我可以像这样
if ($json->{'name'} == "Canada") {
// serve index-ca.php
} else {
// server index.php
}
我一直使用后端的 ip2location 来做这件事。有一个免费版本可以提供所有这些信息,还有一个付费版本,甚至可以将 IP 精确到城市。它不提供语言信息,但通过国家/地区查找并不是这样做的方法(应该通过查看
navigator.languages
来完成)。这可以轻松地传递到第一个请求的返回主体中的任何需要它的 JavaScript 中(浏览器中的 API 调用很昂贵)。
主要优点是消除了对第三方服务的依赖。如果该服务停机或不可访问,它会影响您的网站。
在台湾生活了近十年(相当愉快)后,我最近回到美国,我无法过分强调我对那些决定为我选择一切都必须用中文显示的网站(和其他网站)的愤怒。虽然我并不反对中文,但我有一个听力缺陷,无法理解口语中文,最终我放弃了学习这种语言。
我可以礼貌地建议开发人员让最终用户决定他们想要哪种语言,而不是为他们决定。