Руководства

Серверная геолокация в приложении на Node или PHP

В большинстве случаев, в том числе для персонализации, настроек по умолчанию и аналитики, геолокации место на сервере, поскольку ей не нужно никакого участия браузера посетителя и вообще никакого скрипта на стороне клиента.

Сам запрос

Независимо от языка вызов один и тот же: обычный HTTP-запрос GET к /v1/ip с ключом в заголовке.

GET /v1/ip?ip=203.0.113.60
X-API-Key: mg_live_examplekey123
{
  "status": "ok",
  "ip": "203.0.113.60",
  "version": 4,
  "found": true,
  "country": "Netherlands",
  "country_code": "NL",
  "region": "North Holland",
  "city": "Amsterdam",
  "postcode": "1012",
  "lat": 52.3702,
  "lon": 4.8952,
  "timezone": "Europe/Amsterdam",
  "asn": 3344,
  "org": "Example ISP"
}

В приложении на PHP

Получите собственный адрес посетителя из запроса, обычно из $_SERVER['REMOTE_ADDR'], передайте его в параметре ip и выполните HTTP-запрос тем HTTP-клиентом, который уже используется в вашем PHP-проекте, curl или библиотекой-обёрткой над ним. Поскольку этот сайт сам построен на PHP с серверной отрисовкой и без клиентского JavaScript, этот подход естественно вписывается в обычный процесс отрисовки страницы: данные о местоположении доступны ещё до генерации разметки страницы.

В приложении на Node

Прочитайте адрес посетителя из объекта входящего запроса, обычно из req.socket.remoteAddress или из заголовка, который устанавливает обратный прокси, например X-Forwarded-For, если такой прокси стоит перед вашим приложением, и выполните тот же GET-запрос выбранным HTTP-клиентом до отрисовки ответа.

Если перед приложением стоит прокси

Если ваше приложение работает за балансировщиком нагрузки или обратным прокси, адрес, который напрямую видит ваш код, может оказаться адресом самого прокси, а не посетителя. Проверьте заголовок с перенаправленным адресом, который устанавливает ваш прокси, и явно передайте этот адрес в параметре ip, а не полагайтесь на исходный удалённый адрес соединения, иначе вы определите местоположение собственной инфраструктуры, а не посетителя.

Стоимость запроса в любом случае

Само определение стоит один запрос, откуда бы его ни вызывали: из PHP, из Node или из любого другого серверного языка, поскольку стоимость привязана к запросу, дошедшему до API, а не к тому, что сделало вызов. На любом языке кэшируйте результат на время сессии, чтобы не повторять определение на каждой странице.

Серверная геолокация работает одинаково на любом серверном языке: один HTTP-вызов с адресом посетителя. Все варианты аутентификации описаны в документации по аутентификации, а список полей приведён в документации по определению IPv4.