Geolocalización en PHP5 usando GeoIP de Maxmind
11/07/2008
Una de las principales ventajas de la red Internet es el alcance de la misma, ya que es posible conectarse a ella y utilizar los servicios que ofrece desde prácticamente cualquier país del mundo. Esto, que puede parecer una enorme ventaja, puede también suponer un problema a la hora de analizar con detalle el tráfico recibido en un sitio web.
Para ayudarnos en esa tarea podemos utilizar una herramienta que nos permita identificar la localidad y/o el país desde el que se producen las visitas a nuestra web. De esta forma seremos capaces de llevar a cabo acciones como esta:
- Seleccionar automáticamente el idioma en el que se muestran los contenidos de la web en función del país de procedencia del visitante.
- Mostrar páginas personalizadas para visitantes de diferentes regiones geográficas.
- Preseleccionar automáticamente el país, provincia y ciudad de residencia en los formularios que precisen esa información.
Una base de datos de geolocalización es el elemento fundamental necesario para poder determinar la ubicación geográfica a partir de la dirección IP del visitante. Para el desarrollo de esta aplicación se ha utilizado la proporcionada por Maxmind que está localizable, junto con su API para PHP en la dirección
http://www.maxmind.com/app/php.
El siguiente ejemplo de código muestra el procedimiento a seguir para determinar la ubicación geográfica del visitante de la página, que pasa por la obtención de la dirección IP real del visitante (sin tener en cuenta proxyes), la carga de la base de datos de geolocalización y la llamada a la función que se encarga de convertir esa dirección IP en código de pais.
<?php
include_once('geoipcity.inc');
if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
$ip_address = $_SERVER["HTTP_X_FORWARDED_FOR"];
} elseif (isset($_SERVER["HTTP_CLIENT_IP"])) {
$ip_address = $_SERVER["HTTP_CLIENT_IP"];
} else {
$ip_address = $_SERVER["REMOTE_ADDR"];
}
$gi = geoip_open('GeoLiteCity.dat',GEOIP_STANDARD);
$record = geoip_record_by_addr($gi,$ip_address);
$pais = $record->country_code;
?>