Como obtener la dirección IP del cliente en PHP

Un dato útil si comenzamos a guardar estadísticas es la IP del usuario que se conecta al sitio. Este dato puede servirnos para hacer diferentes funcionalidades interesantes, como controlar el acceso único por sesión, detectar el país de origen del usuario, etc.

Para poder obter esta información debemos hacer uso de la variable $_SERVER que contiene los headers que envía el navegador con información del cliente entre otras cosas. Documentación completa aquí.

Obteniendo información de las llamadas

El primer paso es hacer un php que imprima los valores de $_SERVER para saber que variables tenemos en el entorno configurado de esta manera:

<?php

var_dump($_SERVER);

/* Ejemplo de salida:

array(29) {
 ["HTTP_HOST"]=>
 string(25) "ejemplo.com"
 ["HTTP_CONNECTION"]=>
 string(10) "keep-alive"
 ["HTTP_CACHE_CONTROL"]=>
 string(9) "max-age=0"
 ["HTTP_ACCEPT"]=>
 string(74) "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp;q=0.8"
 ["HTTP_UPGRADE_INSECURE_REQUESTS"]=>
 string(1) "1"
 ["HTTP_USER_AGENT"]=>
 string(120) "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.86 Safari/537.36"
 ["HTTP_ACCEPT_ENCODING"]=>
 string(19) "gzip, deflate, sdch"
 ["HTTP_ACCEPT_LANGUAGE"]=>
 string(50) "en-US,en;q=0.8,es;q=0.6,pt;q=0.4,it;q=0.2,ca;q=0.2"
 ["HTTP_COOKIE"]=>
 string(85) "..."
 ["PATH"]=>
 string(28) "/usr/local/bin:/usr/bin:/bin"
 ["SERVER_SIGNATURE"]=>
 string(86) " Apache en ubuntu XX.... "
 ["SERVER_SOFTWARE"]=>
 string(22) "Apache/2.2.22 (Ubuntu)"
 ["SERVER_NAME"]=>
 string(25) "ejemplo.com"
 ["SERVER_ADDR"]=>
 string(14) "a.b.c.d"
 ["SERVER_PORT"]=>
 string(2) "80"
 ["HTTP_CF_CONNECTING_IP"]=>
 string(12) "a.b.c.d"
 ["REMOTE_ADDR"]=>
 string(12) "a.b.c.d"
 ["DOCUMENT_ROOT"]=>
 string(34) "/var/www/ejemplo.com"
 ["SERVER_ADMIN"]=>
 string(19) "[email protected]"
 ["SCRIPT_FILENAME"]=>
 string(44) "/var/www/ejemplo.com/index.php"
 ["REMOTE_PORT"]=>
 string(5) "XXX"
 ["GATEWAY_INTERFACE"]=>
 string(7) "CGI/1.1"
 ["SERVER_PROTOCOL"]=>
 string(8) "HTTP/1.1"
 ["REQUEST_METHOD"]=>
 string(3) "GET"
 ["QUERY_STRING"]=>
 string(0) ""
 ["REQUEST_URI"]=>
 string(1) "/"
 ["SCRIPT_NAME"]=>
 string(10) "/index.php"
 ["PHP_SELF"]=>
 string(10) "/index.php"
 ["REQUEST_TIME_FLOAT"]=>
 float(1462210898.123)
 ["REQUEST_TIME"]=>
 int(1462210898)
} */

Podemos analizar que están definidos 2 valores interesantes: HTTP_CF_CONNECTING_IP y REMOTE_ADDR. Con estos valores podemos definir la función para obtener la IP:

<?php
function obtenerIP() {

    //si utilizamos un CDN, por ejemplo Cloudflare, genera un header con la IP real del cliente que se conecta
    if( isset($_SERVER['HTTP_CF_CONNECTING_IP']) )
        return $_SERVER['HTTP_CF_CONNECTING_IP'];

    //dependiendo de la configuración de proxys o apache o nginx tenemos varias variables de servidor que PHP recibe. Al final del artículo hay una lista de posibles variables

    if( isset($_SERVER['HTTP_CLIENT_IP']) ) 
        return $_SERVER['HTTP_CLIENT_IP'];
    
    if( isset($_SERVER['HTTP_X_FORWARDED_FOR']) )
        return $_SERVER['HTTP_X_FORWARDED_FOR'];

    if( isset($_SERVER['<variable seteada por server>']) )
        return $_SERVER['<variable seteada por server>'];

    //ultimo recurso, lo que envía el navegador 
    if( isset($_SERVER['REMOTE_ADDR']) ) 
        return $_SERVER['REMOTE_ADDR']; 

    //no hay nada definido
    return null; 
}

Lista de variables interesantes para obtener IP

Esta es una lista de valores típicos seteados por el servidor que nos serán de utilidad para obtener la IP del cliente:

  • HTTP_CLIENT_IP
  • HTTP_X_REAL_IP
  • HTTP_X_FORWARDED_FOR
  • HTTP_X_FORWARDED
  • HTTP_FORWARDED_FOR
  • HTTP_FORWARDED
  • REMOTE_ADDR

 

Espero que sea de ayuda, pero este tipo de información depende mucho de como esté montado el servidor.

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInShare on StumbleUpon
Pablo Oneto

Soy un desarrollador de software web especializado en PHP.

Deja un comentario