Guida alla geolocalizzazione IP in PHP
Ottieni il paese, la città e le coordinate approssimative di un indirizzo IP in PHP.
Cercare un indirizzo IP in PHP
La richiesta accetta un indirizzo IPv4 o IPv6 e richiede JSON. Sostituisci l’indirizzo di esempio con quello da esaminare.
<?php
$ip = '8.8.8.8'; // Replace with a validated IPv4 or IPv6 address.
if (!filter_var($ip, FILTER_VALIDATE_IP)) {
throw new InvalidArgumentException('Invalid IP address');
}
$url = 'https://api.ipquery.io/' . rawurlencode($ip) . '?format=json';
$handle = curl_init($url);
curl_setopt_array($handle, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 3,
CURLOPT_TIMEOUT => 8,
]);
$body = curl_exec($handle);
$status = curl_getinfo($handle, CURLINFO_HTTP_CODE);
if ($body === false) {
$error = curl_error($handle);
throw new RuntimeException('IP lookup failed: ' . $error);
}
if ($status !== 200) {
throw new RuntimeException('IPQuery returned HTTP ' . $status);
}
$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
if (($data['ip'] ?? null) !== $ip || !isset($data['location']) || !is_array($data['location'])) {
throw new RuntimeException('Unexpected IPQuery response');
}
$location = $data['location'];
$countryCode = strtoupper(trim((string) ($location['country_code'] ?? '')));
$city = trim((string) ($location['city'] ?? ''));
echo 'Country code: ' . ($countryCode ?: 'Unknown') . PHP_EOL;
echo 'City: ' . ($city ?: 'Unknown') . PHP_EOL;
// Coordinates describe an approximate network location, not the user.
$latitude = $location['latitude'] ?? null;
$longitude = $location['longitude'] ?? null;
if (preg_match('/^[A-Z]{2}$/', $countryCode) &&
!in_array($countryCode, ['XX', 'ZZ'], true) &&
is_numeric($latitude) && is_numeric($longitude)) {
printf('Approximate coordinates: %.5f, %.5f%s', $latitude, $longitude, PHP_EOL);
}Richiede PHP con l’estensione cURL. Il timeout di connessione è di tre secondi e il limite di durata totale della richiesta è di otto secondi.
Leggere i campi di posizione
location.country_code è il codice paese a due lettere; location.country è il nome del paese. location.city può essere vuoto anche se il paese è noto. Mantieni un valore vuoto come sconosciuto.
location.latitude e location.longitude sono coordinate approssimative della posizione della rete. Verifica che sia disponibile un’indicazione di località utilizzabile prima di mostrarle; le sole coordinate numeriche non stabiliscono una posizione. Non identificano un dispositivo o una persona.
Per ottenere l’indirizzo da cui proviene la richiesta, chiama https://api.ipquery.io/?format=json. Una richiesta dal server restituisce l’IP con cui il server si connette; una richiesta dal browser restituisce l’indirizzo visibile della sua connessione.
Precisione e sicurezza
La geolocalizzazione IP è una stima della posizione della rete, non di un dispositivo. VPN, proxy, reti mobili e gateway degli operatori possono collocare l’indirizzo lontano dall’utente. Tratta i valori mancanti come sconosciuti invece di completarli con una supposizione.
Se l’applicazione legge X-Forwarded-For, consideralo attendibile solo quando è fornito da un proxy sotto il tuo controllo. Gli header forniti dal client possono essere falsificati. Valida gli indirizzi prima di effettuare le richieste e gestisci timeout ed errori HTTP separatamente da un risultato riuscito.
Riferimento dell’API