【问题标题】:CakePHP Get IP AddressCakePHP 获取 IP 地址
【发布时间】:2011-08-06 05:24:19
【问题描述】:

如何在 CakePHP 中获取客户端的 IP 地址?在普通 PHP 中应该是 $_SERVER['REMOTE_ADDR']

我认为它就像所有 $_SERVER 变量一样,可以在 CakePHP 中使用 env('VAR_NAME')getClientIP() 访问,但它不会返回相同的结果。

有什么想法吗?

【问题讨论】:

    标签: php cakephp ip-address


    【解决方案1】:

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

    【讨论】:

    • 谢谢。效果很好。我听说 RequestHandler 可能比使用纯 php $_SERVER['REMOTE_ADDR'] 慢。这是真的吗?
    • 嗯,添加复杂层总是会减慢处理速度,但这不仅仅是简单的:return $_SERVER['REMOTE_ADDR'];
    • getClientIp(false) 在某些情况下可能是可取的,有时(例如在 Heroku 上)IP 位于 HTTP_X_FORWARDED_FOR 中。
    • 已弃用,请改用您的控制器中的$this->request->clientIp()
    • @Brad 感谢您的提示,您可能为我节省了很多痛苦和痛苦。
    【解决方案2】:

    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();
    【解决方案3】:

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

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

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

    所以基本上,Router::getRequest() 可以作为 ModelController$this->request

    的替代品

    【讨论】:

      【解决方案4】:

      在 cakephp 3.x 中

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

      【讨论】:

        【解决方案5】:

        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

        【讨论】:

          【解决方案6】:

          您可以使用$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

          【讨论】:

            猜你喜欢
            • 2010-11-04
            • 1970-01-01
            • 2011-10-11
            • 1970-01-01
            • 2013-01-16
            • 2011-02-07
            • 2014-02-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多