Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CakePHP获取IP地址_Php_Cakephp_Ip Address - Fatal编程技术网

CakePHP获取IP地址

CakePHP获取IP地址,php,cakephp,ip-address,Php,Cakephp,Ip Address,如何用CakePHP获取客户端的IP地址?它应该是普通PHP中的$\u服务器['REMOTE\u ADDR'] 我认为它类似于所有$\u服务器vars,可以使用CakePHP中的env('VAR\u NAME')或getClientIP()访问,但它不会返回相同的结果 有什么想法吗?CakePHP 1.x: 因此,为了澄清: public $components = array( 'RequestHandler' ); 然后在控制器方法中: $this->RequestHand

如何用CakePHP获取客户端的IP地址?它应该是普通PHP中的
$\u服务器['REMOTE\u ADDR']

我认为它类似于所有
$\u服务器
vars,可以使用CakePHP中的
env('VAR\u NAME')
getClientIP()
访问,但它不会返回相同的结果


有什么想法吗?

CakePHP 1.x

因此,为了澄清:

public $components = array(
    'RequestHandler'
);
然后在控制器方法中:

$this->RequestHandler->getClientIp();
CakePHP 2.x和CakepPHP 3.x

RequestHandler::getClientIp()
已被弃用;您可以从以下位置获取客户端IP:

CakePHP 3.x的用法:

//in controller
$ip = $this->request->clientIp();
CakePHP2.x的用法

//in controller
$this->request->ClientIp();
CakePHP1.x的用法

//in controller
RequestHandlerComponent::getClientIP();

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

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

改用
Router::getRequest()->clientIp()


因此,基本上,
Router::getRequest()
可以作为控制器的
$this->request
类ServerRequest中的Cakephp 3具有clientIP函数:

您可以访问: 在控制器中:
$this->request->clientIp();
在控制器中:
//首先添加路由器支持
使用蛋糕\路由\路由器;
//在方法中使用
路由器::getRequest()->clientIp()
如果您使用以前版本的框架或需要某些特殊行为,我将保留此函数:

公共函数clientIp()
{
if($this->trustProxy&&$this->getEnv('HTTP\u X\u FORWARDED\u FOR')){
$addresses=explode(“,”,$this->getEnv('HTTP\u X\u FORWARDED\u FOR');
$ipaddr=结束($addresses);
}elseif($this->trustProxy&&$this->getEnv('HTTP\u CLIENT\u IP')){
$ipaddr=$this->getEnv('HTTP\u CLIENT\u IP');
}否则{
$ipaddr=$this->getEnv('REMOTE_ADDR');
}
返回修剪($ipaddr);
}
例如,当您在本地环境中工作时,此函数将返回值“::1”

最好将其添加到bootstrap.php引导文件中,因为您可以从任何地方访问它:

函数clientIp($defaultIP='127.0.0.1'){
$ipaddr=null;
如果(!空($\u服务器['HTTP\u客户端\u IP'])){
$ipaddr=$\服务器['HTTP\客户端\ IP'];
}elseif(!empty($_服务器['HTTP\u X\u FORWARDED\u FOR'])){
$ipaddr=$\u服务器['HTTP\u X\u FORWARDED\u'];
}否则{
$ipaddr=$\u服务器['REMOTE\u ADDR'];
}
$ipaddr=修剪($ipaddr);
如果($ipaddr=='::1'){
$ipaddr=$defaultIP;
}
返回$ipaddr;
}
祝你好运和快乐=cakephp 3.x中的D


在控制器中获取客户端ip-$this->request->clientIp()

您可以使用
$this->request->clientIp()
获取当前访问者的IP地址

Cake\Http\ServerRequest::clientIp()
Returns the current visitor’s IP address.
供进一步参考

谢谢。效果很好。我听说RequestHandler可能比使用纯php$\u服务器['REMOTE\u ADDR']慢。这是真的吗?嗯,添加复杂的层次总是会减慢处理速度,但这不仅仅是:
return$\u SERVER['REMOTE\u ADDR']
getClientIp(false)
在某些情况下可能是可取的,有时(比如在Heroku上)IP是HTTP\u X\u转发的。它已被弃用,请改用控制器中的
$this->request->clientIp()
。@Brad谢谢你的提示,你可能为我省去了很多痛苦和痛苦。如果在模型中,do
$ServerRequest=new\Cake\Http\ServerRequest()
然后
$entity->remote_addr=$ServerRequest->clientIp()
Cake\Http\ServerRequest::clientIp()
Returns the current visitor’s IP address.