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?
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
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
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