CakePHP Получить IP-адрес - PullRequest
22 голосов
/ 15 апреля 2011

Как я могу получить IP-адрес клиента в CakePHP? Это было бы $_SERVER['REMOTE_ADDR'] в простом PHP.

Я думал, что это как все $_SERVER переменные и к ним можно получить доступ, используя env('VAR_NAME') или getClientIP() в CakePHP, но он не возвращает те же результаты.

Есть идеи?

Ответы [ 6 ]

57 голосов
/ 15 апреля 2011

CakePHP 1.x :

RequestHandlerComponent::getClientIp();

Итак, чтобы уточнить:

public $components = array(
    'RequestHandler'
);

Тогда вметод контроллера:

$this->RequestHandler->getClientIp();

CakePHP 2.x :

RequestHandler::getClientIp() устарел;Вы можете получить IP-адрес клиента из объекта CakeRequest :

$this->request->clientIp();
12 голосов
/ 17 марта 2016

CakePHP 3.x использование:

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

Использование CakePHP 2.x

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

Использование CakePHP 1.x

//in controller
RequestHandlerComponent::getClientIP();
2 голосов
/ 28 августа 2018

В cakephp 3.x

В вашем контроллере для получения клиента ip - $ this-> request-> clientIp ();

2 голосов
/ 22 мая 2016

Если вам нужно получить IP-адрес из модели, $this->request->getClientIp() не будет работать, выбрасывая:

Ошибка: Вызов функции-члена clientIp () для необъекта

Вместо этого используйте Router::getRequest()->clientIp().

Таким образом, Router::getRequest() может служить заменой модели контроллера $this->request

0 голосов
/ 28 августа 2018

Вы можете использовать $this->request->clientIp(); для получения IP-адреса текущего посетителя.

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

Для дальнейшей справки https://book.cakephp.org/3.0/en/controllers/request-response.html#reading-http-headers

0 голосов
/ 12 мая 2018

Cakephp 3 имеет функцию clientIP в классе ServerRequest:

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

Вы можете получить доступ:

в контроллере контроллера:

 $this->request->clientIp();

в контроллере контроллера:

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

Я оставляю функцию, если вы используете предыдущую версию фреймворка или требуете специального поведения:

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

Например, эта функция возвращает значение «:: 1» при работе в локальной среде.

Рекомендуется добавить его в загрузочный файл bootstrap.php, поскольку вы можете получить к нему доступ из любого места:

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

удачи и удачного кодирования! = D

...