Geolocalización en tu página web o blog
Geolocalización es la palabra que designa la acción de informar la posición y localización geográfica de un determinado (en el caso que hablamos) visitante de una web.
En el siguiente manual voy a escribir una guía de pasos para dotar de soporte de geolocalización (de forma totalmente gratuita) un servidor web, y así utilizar esta información de manera sencilla y eficiente.
Así podremos guardar información acerca de la localización de los usuarios que han comentado, que han subido una foto, e incluso combinarlo con mod_rewrite y realizar redirecciones dependiendo de su pais, etc.
Requisitos previos
Para preparar el sistema de geolocalización nos vamos a basar en un servidor Apache (de la rama 2.x) bajo un sistema operativo Linux, en nuestro caso un CentOS. También necesitaremos soporte PHP y herramientas de compilación, que por lo general ya vienen instaladas en todo servidor Linux.
En este manual vamos a utilizar la base de datos de MaxMind, que incorpora GeoLite City una base de información de paises y ciudades, que además provee varios métodos de uso:
- Formato CSV: Formato de texto plano, separado por comas, que puede utilizarse para desarrollar una aplicación de búsqueda y resolución de IPs, o por otra parte, importar en una base de datos SQL, para crear un sistema de consulta.
- Formato binario: Un formato binario generado por MaxMind, mucho más eficiente y rápido, que permite hacer consultas de manera más ligera. El formato binario permite la manipulación con una API open source para diferentes lenguajes (PHP, C, Java, Perl, Python, C#, Pascal, Ruby...).
En este manual vamos a ir un poco más allá y compilaremos el código para utilizarlo como módulo de Apache, y ganar en rapidez y eficiencia, teniendo a nuestra disposición unas variables GEOIP_COUNTRY_CODE y GEOIP_COUNTRY_NAME con la información disponibles para utilizar en nuestro código PHP directamente.
Descarga y preparación de ficheros
- En primer lugar, nos descargamos los fuentes del módulo mod_geoip2 para Apache (versión 1.2.1 en estos momentos). Lo desempaquetamos con un tar -xzvf mod_geoip2_1.2.1.tar.gz y accedemos a la carpeta creada.
- También nos descargaremos la última API de GeoIP para C (1.4.4 en estos momentos), ya que se necesita para generar el módulo mod_geoip2 para Apache. Desempaquetamos entonces, con un tar -xzvf GeoIP.tar.gz y accedemos a la carpeta creada.
Compilación de la API para C
¡Ojo! Antes de compilar el módulo de Apache, necesitaremos esta segunda API (para C) instalada en nuestro sistema. Para ello, escribimos el mantra de compilación ./configure, make y finalmente, realizamos la instalación con un make install.
Esto habrá generado unas cabeceras en nuestra carpeta /usr/local/include, entre otros que nos permitirán compilar el módulo de Apache sin problemas.
Asi pues, salimos de la carpeta actual cd .., volviendo a la carpeta de las fuentes del mod_geoip2. Aquí escribiremos apxs -i -a -L/usr/local/lib -I/usr/local/include -lGeoIP -c mod_geoip.c. La utilidad apxs (APache eXtenSion tool) se encargará de compilar el modulo e instalarlo en su ubicación correspondiente (generalmente /usr/lib/httpd/modules/). Incluso, dará los permisos adecuados e insertará la linea en el fichero de configuración de Apache.
No obstante, puedes comprobar que, ha sido insertada, en el fichero /etc/httpd/httpd.conf o similar:
LoadModule geoip_module modules/mod_geoip.so
Configuración del módulo mod_geoip2
En el anterior fichero de configuración, podemos añadir una linea Include mod_geoip.conf para crear un fichero mod_geoip.conf donde ubicar la información básica para hacer funcionar el módulo:
# mod_geoip2 configuration file
GeoIPEnable On
GeoIPDBFile /usr/local/share/GeoIP/GeoLiteCity.dat
GeoIPEnableUTF8 On
GeoIPOutput Env
#GeoIPOutput Notes
#GeoIPOutput All
Remarcar que esta configuración básica activa el módulo con nuestra base binaria GeoLiteCity.dat (~16MB) que tendremos que colocar en la ruta /usr/local/share/GeoIP. En la directiva GeoIPDBFile se pueden establecer varias bases con distinto nombre, para utilizar según necesidades de memoria, situación, etc.
Por último, existen dos formas de proporcionar información geolocalizable desde Apache, a través de variables de entorno (Environment) activando GeoIPOutput a Env o a través del comando apache_note de PHP. La primera es más cómoda, así que activamos sólo esta, y desactivamos las demás para ahorro de recursos, aunque si se desea se pueden activar las dos con All.
Ejemplo final
Finalmente, tenemos el sistema de geolocalización instalado y nos proporciona información adicional desde PHP, mediante el array asociativo SERVER, por ejemplo $_SERVER['GEOIP_CITY']:
Variable | Valor |
---|---|
GEOIP_CONTINENT_CODE | EU |
GEOIP_COUNTRY_CODE | ES |
GEOIP_COUNTRY_NAME | Spain |
GEOIP_REGION | 29 |
GEOIP_CITY | Madrid |
GEOIP_DMA_CODE | 0 |
GEOIP_AREA_CODE | 0 |
GEOIP_LATITUDE | 40.400002 |
GEOIP_LONGITUDE | -3.683300 |
Como extra, en ip-to-country existen varios comprimidos de diferente tamaño, con un conjunto de banderas, ordenadas por su código de pais, que pueden servir para colocar imagen en nuestro código PHP.
Otros sistemas o bases de Geolocalización
Si conoces alguno, mencionalo en los comentarios para añadirlo: