La información es poder, y conocer todo lo que podamos de un visitantes a nuestra página siempre es útil.

Uno de los datos más útiles para analizar al visitante es su dirección IP . Este número está determinado por su conexión a Internet. En algunos casos cambiará al reiniciar el router, pero se mantendrá invariable durante bastante tiempo. Es posible conocer la ubicación geográfica de un usuario a partir de su IP.

Una llamada tan sencilla como esta nos dará directamente la dirección IP del usuario :

$ip = $_SERVER['REMOTE_ADDR'];

Existe sin embargo un problema. El usuario puede estar navegando a través de un servidor proxy . Este tipo de servidores sirven de intermediarios, obteniendo las páginas que el usuario requiere para pasárselas a él. De esta manera, la IP real del usuario queda oculta por la IP del servidor proxy.

Los motivos para usar un proxy son por velocidad (el servidor proxy guarda en cache muchas peticiones, por lo que puede enviar directamente la copia en cache de una página a través de una red interna rápida, en lugar de descargarla por internet en una conexión lenta), por obtener una IP de un país específico donde esté ubicado el servidor, o directamente para intentar enmascarar la IP del navegante.

En algunos casos, cuando la privacidad no es lo esencial en la configuración del servidor proxy, éste etiquetará las conexiones con un marcado indicando que se trata de un intermediario en favor de otra IP, de manera que podemos intentar leer esta información.

Diferentes servidores proxy utilizarán nomenclaturas distintas, por lo que tenemos que comprobar varias alternativas para intentar detectar si se trata de este tipo de conexiones.

A continuación, el código del sencillo ejemplo que nos permitirá conocer la IP del visitante , teniendo en cuenta si se utiliza un proxy que no enmascare totalmente la IP del usuario

<?php

// Intentamos primero saber si se ha utilizado un proxy para acceder a la página,
// y si éste ha indicado en alguna cabecera la IP real del usuario.
if (getenv('HTTP_CLIENT_IP')) {
  $ip = getenv('HTTP_CLIENT_IP');
} elseif (getenv('HTTP_X_FORWARDED_FOR')) {
  $ip = getenv('HTTP_X_FORWARDED_FOR');
} elseif (getenv('HTTP_X_FORWARDED')) {
  $ip = getenv('HTTP_X_FORWARDED');
} elseif (getenv('HTTP_FORWARDED_FOR')) {
  $ip = getenv('HTTP_FORWARDED_FOR');
} elseif (getenv('HTTP_FORWARDED')) {
  $ip = getenv('HTTP_FORWARDED');
} else {
  // Método por defecto de obtener la IP del usuario
  // Si se utiliza un proxy, esto nos daría la IP del proxy
  // y no la IP real del usuario.
  $ip = $_SERVER['REMOTE_ADDR'];
}

echo "Su IP parece ser: ".$ip;