CakePHP Obtener dirección IP

3 minutos de lectura

Avatar de usuario de Aditya P Bhatt
Aditya P. Bhatt

¿Cómo puedo obtener la dirección IP del cliente en CakePHP? Sería $_SERVER['REMOTE_ADDR'] en PHP simple.

pensé que era como todo $_SERVER vars y se puede acceder usando env('VAR_NAME')o getClientIP() en CakePHP, pero no devuelve los mismos resultados.

¿Algunas ideas?

avatar de usuario de rich97
rico97

CakePHP 1.x:

RequestHandlerComponent::getClientIp();

Así que para aclarar:

public $components = array(
    'RequestHandler'
);

Luego en el método del controlador:

$this->RequestHandler->getClientIp();

CakePHP 2.x y CakepPHP 3.x:

RequestHandler::getClientIp() es obsoleto; puede obtener la IP del cliente desde el CakeRequest objeto:

$this->request->clientIp();

  • Gracias. Funciona genial. Escuché que RequestHandler puede ser más lento que usar php $_SERVER puro[‘REMOTE_ADDR’]. ¿Es esto cierto?

    – Ryan

    26 de septiembre de 2011 a las 9:31

  • Bueno, agregar capas de complejidad siempre ralentiza el procesamiento, pero esto hace más que simplemente: return $_SERVER['REMOTE_ADDR'];.

    – rico97

    26 de septiembre de 2011 a las 16:08


  • getClientIp(false) puede ser recomendable en ciertas situaciones, a veces (como en Heroku) la IP está en HTTP_X_FORWARDED_FOR.

    – Brad Koch

    4 de agosto de 2012 a las 19:53

  • Está en desuso, usa $this->request->clientIp() de su, controlador en su lugar.

    – mrdaliri

    8 de agosto de 2012 a las 11:17

  • @Brad Gracias por el consejo, probablemente me ahorraste mucho dolor y miseria.

    – Jackson

    18 de diciembre de 2013 a las 5:30


Avatar de usuario de Aditya P Bhatt
Aditya P. Bhatt

Uso de CakePHP 3.x:

//in controller
$ip = $this->request->clientIp();

Uso de CakePHP 2.x

//in controller
$this->request->ClientIp();

Uso de CakePHP 1.x

//in controller
RequestHandlerComponent::getClientIP();

  • Si dentro de un modelo, haz $ServerRequest = new \Cake\Http\ServerRequest(); y entonces $entity->remote_addr = $ServerRequest->clientIp();

    – ᴍᴇʜᴏᴠ

    29 de octubre de 2019 a las 8:12

Si necesita obtener la dirección IP desde dentro de un modelo, $this->request->getClientIp() no funcionará, lanzando:

Error: Llamada a una función miembro clientIp() en un no objeto

Usar Router::getRequest()->clientIp() en cambio.

Así que básicamente, Router::getRequest() puede servir como un Modeloreemplazo de la Controlador‘s $this->request

En cakephp 3.x

En su controlador para obtener la ip del cliente – $this->request->clientIp();

Puedes usar $this->request->clientIp(); para obtener la dirección IP del visitante actual.

Cake\Http\ServerRequest::clientIp()
Returns the current visitor’s IP address.

Para mayor referencia
https://book.cakephp.org/3.0/en/controllers/request-response.html#reading-http-headers

avatar de usuario de fitorec
fitorec

Cakephp 3 tiene la función clientIP en la clase ServerRequest:

https://github.com/cakephp/cakephp/blob/master/src/Http/ServerRequest.php#L578

Puedes acceder:

en un controlador controlador:

 $this->request->clientIp();

en un controlador controlador:

 // firts add Router support
 use Cake\Routing\Router;
 // Use in a method
 Router::getRequest()->clientIp()

Dejo la función por si usas una versión anterior del framework o requieres algún comportamiento especial:

public function clientIp()
{
    if ($this->trustProxy && $this->getEnv('HTTP_X_FORWARDED_FOR')) {
        $addresses = explode(',', $this->getEnv('HTTP_X_FORWARDED_FOR'));
        $ipaddr = end($addresses);
    } elseif ($this->trustProxy && $this->getEnv('HTTP_CLIENT_IP')) {
        $ipaddr = $this->getEnv('HTTP_CLIENT_IP');
    } else {
        $ipaddr = $this->getEnv('REMOTE_ADDR');
    }
    return trim($ipaddr);
}

Por ejemplo, esta función devuelve el valor “:: 1” cuando trabaja en un entorno local.

Es una buena idea agregarlo en el archivo de arranque bootstrap.php, ya que puedes acceder a él desde cualquier lugar:

function clientIp($defaultIP = '127.0.0.1') {
        $ipaddr = null;
        if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
            $ipaddr = $_SERVER['HTTP_CLIENT_IP'];
        } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $ipaddr = $_SERVER['HTTP_X_FORWARDED_FOR'];
        } else {
            $ipaddr = $_SERVER['REMOTE_ADDR'];
        }
        $ipaddr = trim($ipaddr);
        if ($ipaddr == '::1') {
            $ipaddr = $defaultIP;
        }
        return $ipaddr;
}

¡buena suerte y feliz codificación! =D

¿Ha sido útil esta solución?