web-dev-qa-db-ja.com

CakePHPがIPアドレスを取得

CakePHPでクライアントのIPアドレスを取得するにはどうすればよいですか?プレーンなPHPでは_$_SERVER['REMOTE_ADDR']_になります。

すべての_$_SERVER_変数のようで、CakePHPでenv('VAR_NAME')またはgetClientIP()を使用してアクセスできると思いましたが、同じ結果は返されません。

何か案は?

23
Aditya P Bhatt

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();
_
58
rich97

CakePHP 3.xの使用法:

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

CakePHP 2.xの使用法

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

CakePHP 1.xの使用法

//in controller
RequestHandlerComponent::getClientIP();
14
Aditya P Bhatt

CakePHP 3.xでは

コントローラーでクライアントIPを取得します-$ this-> request-> clientIp();

2
Avani Manvar

モデル内からIPアドレスを取得する必要がある場合、$this->request->getClientIp()は機能せず、以下をスローします。

エラー:非オブジェクトのメンバー関数clientIp()の呼び出し

代わりにRouter::getRequest()->clientIp()を使用してください。

したがって、基本的には、Router::getRequest()ModelController$this->request

2
aexl

$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
Sehdev

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

0
fitorec