CakePHP获取IP地址

25

如何在CakePHP中获取客户端IP地址?在普通的PHP中,可以使用$_SERVER['REMOTE_ADDR']

我以为像所有的$_SERVER变量一样,可以使用env('VAR_NAME')getClientIP()来访问它,但它并不能返回相同的结果。

有什么想法吗?

6个回答

64

CakePHP 1.x:

RequestHandlerComponent::getClientIp();

因此,澄清一下:

public $components = array(
    'RequestHandler'
);

然后在控制器方法中:

$this->RequestHandler->getClientIp();

CakePHP 2.x & CakepPHP 3.x:

RequestHandler::getClientIp()已过时,你可以从CakeRequest对象中获取客户端IP:

$this->request->clientIp();

1
谢谢。运行得很好。我听说使用RequestHandler比使用纯php $_SERVER['REMOTE_ADDR']慢,这是真的吗? - Ryan
增加复杂性的层数总会减慢处理速度,但这比简单地返回 $_SERVER['REMOTE_ADDR']; 做得更多。 - rich97
4
在某些情况下,可能建议使用getClientIp(false),有时(例如在Heroku上)IP位于HTTP_X_FORWARDED_FOR中。 - Brad Koch
2
已经过时,请在您的控制器中使用 $this->request->clientIp() - mrdaliri
@Brad 谢谢你的提示,你可能为我节省了很多痛苦和苦难。 - Jackson
我该如何在Cake 3.2版本中实现它? - sradha

14
CakePHP 3.x 的使用方法:
//in controller
$ip = $this->request->clientIp();
CakePHP 2.x使用
//in controller
$this->request->ClientIp();

CakePHP 1.x的用法

//in controller
RequestHandlerComponent::getClientIP();

如果在模型内部,执行 $ServerRequest = new \Cake\Http\ServerRequest(); 然后 $entity->remote_addr = $ServerRequest->clientIp(); - ᴍᴇʜᴏᴠ

2

在CakePHP 3.x中,

要获取客户端IP地址,请在您的控制器中使用以下代码:$this->request->clientIp();


2
如果您需要从模型中获取IP地址,$this->request->getClientIp()将不起作用,并抛出以下错误:

错误:在非对象上调用成员函数clientIp()

请改用Router::getRequest()->clientIp()
因此,Router::getRequest()可以作为控制器$this->request模型替代。

1

0

Cakephp 3在ServerRequest类中有一个名为clientIP的函数:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接