简体   繁体   中英

CakePHP Get IP Address

How can I get the client's IP address in CakePHP? It'd be $_SERVER['REMOTE_ADDR'] in plain PHP.

I thought it's like all $_SERVER vars and can be accessed using env('VAR_NAME') , or getClientIP() in CakePHP, but it doesn't return the same results.

Any ideas?

CakePHP 1.x :

RequestHandlerComponent::getClientIp();

So to clarify:

public $components = array(
    'RequestHandler'
);

Then in the controller method:

$this->RequestHandler->getClientIp();

CakePHP 2.x & CakepPHP 3.x :

RequestHandler::getClientIp() is deprecated; you can get the client IP from the CakeRequest object :

$this->request->clientIp();

CakePHP 3.x usage:

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

CakePHP 2.x usage

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

CakePHP 1.x usage

//in controller
RequestHandlerComponent::getClientIP();

If you need to get the IP address from within a model, $this->request->getClientIp() won't work, throwing:

Error: Call to a member function clientIp() on a non-object

Use Router::getRequest()->clientIp() instead.

So basically, Router::getRequest() can serve as a Model 's replacement of the Controller 's $this->request

In cakephp 3.x

In your controller to get the client ip - $this->request->clientIp();

Cakephp 3 have clientIP function in the class ServerRequest:

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

You can access:

in a controller controller:

 $this->request->clientIp();

in a controller controller:

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

I leave the function if you use a previous version of the framework or require some special behavior:

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);
}

For example, this function returns the value ":: 1" when you work in a local environment.

It is a good idea to add it in the bootstrap.php boot file, since you can access it from anywhere:

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;
}

good luck and happy coding! =D

You can use $this->request->clientIp(); to get the current visitor's IP address.

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

For further reference https://book.cakephp.org/3.0/en/controllers/request-response.html#reading-http-headers

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM