これはもう解決したと思いますが、今後の参考のために正解を投稿したいと思いました。これと同じ問題に遭遇しました(CodeIgniterアプリでAWSのロードバランサーを使用します)。ご指摘のとおり、HTTP_X_FORWARDED_FORヘッダーを使用して、ロードバランサーまたはその他の分散環境の背後で正しいIPを取得するのは簡単です。問題は、CodeIgniterでこのソリューションを正しく実装する方法です。前の答えが指摘しているように、独自のIP関数を記述します。これに伴う問題は、アプリ全体でip_address()が呼び出された場合はどうなるでしょうか。その関数を(正しいヘッダーを調べる関数で)オーバーライドする方が良いのではないでしょうか?CodeIgniterには、このための便利なメカニズムがあり、便利です。
解決策は、MY_Input.phpという名前の新しいクラスファイルを/ application / coreに作成することにより、CodeIgniter Inputクラスを拡張することです(MY_は拡張機能の構成可能なプレフィックスであり、構成ファイルで変更できます)。拡張機能を使用すると、何も壊さずに、コアファイルを編集せずに、元のクラスメソッドと同じ名前の関数を作成できます。CodeIgniterは、代わりに新しいメソッドを使用します。拡張入力クラスは次のようになります。
class MY_Input extends CI_Input {
function __construct()
{
parent::__construct();
}
//Overide ip_address() with your own function
function ip_address()
{
//Obtain the IP address however you'd like, you may want to do additional validation, etc..
$correct_ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];
return $correct_ip_address;
}
}
このようにして、フレームワークをハッキングせずにコアの動作を変更し、アプリ全体でのip_address()への既存の呼び出しがメソッドを使用するようになります。
チェーン内の他のIPの処理に関しては、クライアントIPのみに関心がある場合は、問題ではありません。少なくともAWSロードバランサーでは、HTTP_X_FORWARDED_FORヘッダーに常に正しいクライアントIPが含まれているようです。