CakePHP3.2.5で、Cake\Network\Request::clientIp()が変更され、HTTP_CLIENT_IPを見るのはRequest::trustProxyがtrueの時のみになりました。(HTTP_CLIENT_IPは偽装されるおそれがあるため。)
なので、ロードバランサーやプロキシを介している場合は、
$this->request->trustProxy = true;
$clientIp = $this->request->clientIp();
とすれば、今までのようにHTTP_X_FORWARDED_FORやHTTP_CLIENT_IPを見ますが、trustProxyがfalseの場合(デフォルト)なら、REMOTE_ADDRだけを見ます。(以前はHTTP_CLIENT_IPやHTTP_CLIENTADDRESSも見ていた。)
というわけで、今まで$this->request->clientIp()を使っていたものが、CakePHP3.2.5へのバージョンアップでそのまま動くかどうかは、少し確認が必要だと思います。(元々REMOTE_ADDRの値が使われていた場合は問題ないはず。)
ユニットテストについて
clientIp()を使用してアクセス制御をしているような部分をテストする場合、私は、
public function testIpOk()
{
$allowedIp = '192.168.1.1';
$this->configRequest([
'headers' => ['CLIENT_IP' => $allowedIp]
]);
$this->get('/articles');
$this->assertResponseOk();
}
という感じで、configRequest()でheadersにCLIENT_IPを指定(HTTP_CLIENT_IPがセットされることになる)していたのですが、これだと今回の更新でclientIp()から値が返ってこなくなります。
headersに指定すると勝手にHTTP_が頭に付くし、REMOTE_ADDRを指定するにはどうしたら、、、と思ってたら、environmentでセットできました。 ![]()
public function testIpOk()
{
$allowedIp = '192.168.1.1';
$this->configRequest([
'environment' => ['REMOTE_ADDR' => $allowedIp]
]);
$this->get('/articles');
$this->assertResponseOk();
}