martes, 2 de julio de 2013

Obtener la dirección IP que solicita una página PHP

A continuación os dejo una función hecha en PHP que permite obtener la dirección IP de quien solicita una página. En esta función se tienen en cuenta las posibles direcciones de los proxys por los que pasa la petición. Para localizar la ip real del usuario se comienza a mirar por el principio hasta encontrar una dirección ip que no sea del rango privado. En caso de no encontrarse ninguna se toma como valor el REMOTE_ADDR.


 function getRealIP(){
  if( $_SERVER['HTTP_X_FORWARDED_FOR'] != '' ){
   $client_ip =
    ( !empty($_SERVER['REMOTE_ADDR']) ) ?
     $_SERVER['REMOTE_ADDR']
    :
             ( ( !empty($_ENV['REMOTE_ADDR']) ) ?
     $_ENV['REMOTE_ADDR']
     :
     "unknown" );

   $entries = split('[, ]', $_SERVER['HTTP_X_FORWARDED_FOR']);

   reset($entries);
   while (list(, $entry) = each($entries)){
    $entry = trim($entry);
    if ( preg_match("/^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/", $entry, $ip_list) ){
     // http://www.faqs.org/rfcs/rfc1918.html
     $private_ip = array(
      '/^0\./',
      '/^127\.0\.0\.1/',
      '/^192\.168\..*/',
      '/^172\.((1[6-9])|(2[0-9])|(3[0-1]))\..*/',
      '/^10\..*/');

     $found_ip = preg_replace($private_ip, $client_ip, $ip_list[1]);

     if ($client_ip != $found_ip){
      $client_ip = $found_ip;
      break;
     }
    }
   }
  } else {
   $client_ip =
    ( !empty($_SERVER['REMOTE_ADDR']) ) ?
     $_SERVER['REMOTE_ADDR']
    :
     ( ( !empty($_ENV['REMOTE_ADDR']) ) ?
     $_ENV['REMOTE_ADDR']
     :
     "unknown" );
  }
  return $client_ip;
 }

5 comentarios:

  1. Respuestas
    1. Could you please post the error you get in order to fix it? This code functions perfectly in all my projects.

      Eliminar
  2. something is missing... For example: where did you got that var $ip_list ?
    That's why is not working.

    ResponderEliminar
  3. [Complement to my first comment] - You just point the result int $ip_list on preg_match(), right? But where are your garantee there will be more than one result? (As you try to get $ip_list[1])

    ResponderEliminar
  4. This function work perfect, really this function allways found in any version of PhP.

    Claro que funciona perfectamente la función, incluso en distintas versiones de PhP.
    Yo creo que anónimo quería llamar la función desde otro archivo y no sabia como =D, entonces lo mas rápido es echar la culpa al funcionamiento de la función.

    Gracias softontherocks.

    ResponderEliminar