CakePHPでクライアントのIPアドレスを取得するにはどうすればよいですか?プレーンなPHPでは_$_SERVER['REMOTE_ADDR']
_になります。
すべての_$_SERVER
_変数のようで、CakePHPでenv('VAR_NAME')
またはgetClientIP()
を使用してアクセスできると思いましたが、同じ結果は返されません。
何か案は?
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();
_
CakePHP 3.xの使用法:
//in controller
$ip = $this->request->clientIp();
CakePHP 2.xの使用法
//in controller
$this->request->ClientIp();
CakePHP 1.xの使用法
//in controller
RequestHandlerComponent::getClientIP();
CakePHP 3.xでは
コントローラーでクライアントIPを取得します-$ this-> request-> clientIp();
モデル内からIPアドレスを取得する必要がある場合、$this->request->getClientIp()
は機能せず、以下をスローします。
エラー:非オブジェクトのメンバー関数clientIp()の呼び出し
代わりにRouter::getRequest()->clientIp()
を使用してください。
したがって、基本的には、Router::getRequest()
はModelのControllerの$this->request
$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
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