我确定您现在已经解决了这个问题,但我想我会发布正确的答案以供将来参考。我遇到了同样的问题(在 AWS 上使用负载均衡器和 CodeIgniter 应用程序。)正如您所指出的,使用 HTTP_X_FORWARDED_FOR 标头在负载均衡器或其他分布式环境后面获取正确的 IP 很容易。问题是我们如何在 CodeIgniter 中正确实现这个解决方案?正如前面的答案所指出的:编写自己的 IP 函数。问题在于,如果在整个应用程序中调用 ip_address() 会怎样?重写该函数不是更好吗(使用查看正确标题的函数)?CodeIgniter 有一个方便的机制,很方便:
解决方案是扩展 CodeIgniter Input 类,方法是在 /application/core 中创建一个名为 MY_Input.php 的新类文件(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。