PHP

Как сделать редирект пользователя в зависимости от страны?

Можно ли перенаправлять пользователя на разные странички в зависимости от страны.
Например, человек заходит из России (.ru), он перенаправляется на страничку index-rus.html
Если человек заходит из Украины (.ua), ему показывается страничка index-ua.html
обычно по IP делают редирект - из английского сайта могут кто угодно зайти
Nike Smolyakov
Nike Smolyakov
39 908
Лучше не редиректить, а на стороне сервера показывать разные страницы

```
<?php
switch($country)
{
case 'ru': include('index-ru.html'); break;
case 'ua': include('index-ua.html'); break;
default: // ???
}
```

и т. д.

Но можно и редиректить

<?php
switch($country)
{
case 'ru': header('Location: /index-ru.html'); exit;
case 'ua': header('Location: /index-ua.html'); exit;
default: // ???
}

Код страны определяется по IP адресу с помощью библиотеки GeoIP или гео-сервисов

Если в форме нет поля для выбора страны и города, то можно вычислить приблизительное местоположение по IP адресу. Это неточная информация, ей нельзя доверять на 100%, потому что пользователь мог зайти на сайт через анонимные прокси. Желательно уточнить у него - "Вы точно из города X?".

Для автоматического вычисления гео-данных можно воспользоваться платной базой GEO данных сервиса MaxMind или платными открытыми веб-сервисами
Или бесплатными сервисами, которые возвращают данные с очень большой погрешностью, например вместо города возвращают страну :(
* ipinfo.io
* www.ipinfodb.com/ip_location_api.php
* ip-api.com
* www.ipaddresslocation.org

Пример получения информации через API MaxMind для языка PHP

```
<?php
require_once 'vendor/autoload.php';
use GeoIp2\Database\Reader;

// This creates the Reader object, which should be reused across lookups.
$reader = new Reader('/usr/local/share/GeoIP/GeoIP2-City.mmdb');

// Replace "city" with the appropriate method for your database, e.g., "country".
$record = $reader->city('128.101.101.101');

print($record->country->isoCode . "\n"); // 'US'
print($record->country->name . "\n"); // 'United States'
print($record->country->names['zh-CN'] . "\n"); // '美国'

print($record->mostSpecificSubdivision->name . "\n"); // 'Minnesota'
print($record->mostSpecificSubdivision->isoCode . "\n"); // 'MN'

print($record->city->name . "\n"); // 'Minneapolis'

print($record->postal->code . "\n"); // '55455'

print($record->location->latitude . "\n"); // 44.9733
print($record->location->longitude . "\n"); // -93.2323
```

Пример получения информации об IP адресе на языке PHP через открытый сервис ipinfo.io

```
$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("http://ipinfo.io/{$ip}"));
echo $details->city; // -> "Mountain View"
```

Пример запроса:
```
$ curl ipinfo.io/8.8.8.8
```

Пример ответа:
```

{
"ip": "8.8.8.8",
"hostname": "google-public-dns-a.google.com",
"loc": "37.385999999999996,-122.0838",
"org": "AS15169 Google Inc.",
"city": "Mountain View",
"region": "CA",
"country": "US",
"phone": 650
}

```