【发布时间】:2011-08-06 05:24:19
【问题描述】:
如何在 CakePHP 中获取客户端的 IP 地址?在普通 PHP 中应该是 $_SERVER['REMOTE_ADDR']。
我认为它就像所有 $_SERVER 变量一样,可以在 CakePHP 中使用 env('VAR_NAME') 或 getClientIP() 访问,但它不会返回相同的结果。
有什么想法吗?
【问题讨论】:
标签: php cakephp ip-address
如何在 CakePHP 中获取客户端的 IP 地址?在普通 PHP 中应该是 $_SERVER['REMOTE_ADDR']。
我认为它就像所有 $_SERVER 变量一样,可以在 CakePHP 中使用 env('VAR_NAME') 或 getClientIP() 访问,但它不会返回相同的结果。
有什么想法吗?
【问题讨论】:
标签: php cakephp ip-address
CakePHP 1.x:
RequestHandlerComponent::getClientIp();
所以澄清一下:
public $components = array(
'RequestHandler'
);
然后在控制器方法中:
$this->RequestHandler->getClientIp();
CakePHP 2.x 和 CakepPHP 3.x:
RequestHandler::getClientIp() 已弃用;你可以从CakeRequest object获取客户端IP:
$this->request->clientIp();
【讨论】:
return $_SERVER['REMOTE_ADDR'];。
getClientIp(false) 在某些情况下可能是可取的,有时(例如在 Heroku 上)IP 位于 HTTP_X_FORWARDED_FOR 中。
$this->request->clientIp()。
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();
如果您需要从模型中获取 IP 地址,$this->request->getClientIp() 将不起作用,抛出:
错误:在非对象上调用成员函数clientIp()
请改用Router::getRequest()->clientIp()。
所以基本上,Router::getRequest() 可以作为 Model 的 Controller 的 $this->request
【讨论】:
在 cakephp 3.x 中
在你的控制器中获取客户端ip - $this->request->clientIp();
【讨论】:
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
【讨论】:
您可以使用$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
【讨论】: