php - 使用 codeigniter 检索用户的真实 IP

标签 php codeigniter

我的应用程序跟踪登录网站的用户的 IP 地址。跟踪在常规网络服务器上运行良好(我们在 hostgator 上),但当我们切换到 PaaS 平台(pagodabox)时似乎开始跟踪奇怪的 IP 地址 在与 pagodabox 支持人员交谈后,他们告诉我 codeigniter 正在接收的 IP pagodabox 的负载平衡器/路由器的 IP 并获取用户的实际 IP 地址,我必须使用 HTTP_X_FORWARDED_FOR

我正在使用 codeigniter 的输入类函数 $this->input->ip_address() 来检索用户的 IP。我查看了该函数并注意到它们具有某种检索 HTTP_X_FORWARDED_FOR IP 值的功能,但我不确定如何使用它。我是否必须在配置中更改/添加某些内容?

编辑:在一些用户指出我应该在负载均衡器的 IP 地址列表中添加什么位置之后,出现了一个新问题:如果 IP 列表经常更改,我该怎么办? (即没有静态IP,全是动态的)

最佳答案

我确定您现在已经解决了这个问题,但我想我会发布正确答案以供将来引用。我遇到了同样的问题(在 AWS 上使用负载均衡器和 CodeIgniter 应用程序。)正如您所指出的,使用 HTTP_X_FORWARDED_FOR header 很容易在负载均衡器或其他分布式环境后面获取正确的 IP。问题是我们如何在 CodeIgniter 中正确地实现这个解决方案?正如前面的答案所指出的:编写自己的 IP 函数。这个问题是,如果在整个应用程序中调用 ip_address() 怎么办?覆盖该函数(使用查看正确 header 的函数)不是更好吗? 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 header 似乎始终包含正确的客户端 IP。

关于php - 使用 codeigniter 检索用户的真实 IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14491043/

相关文章:

php - 如何在点击时设置 Cookie?

php - fatal error : Uncaught CurlException: 26: failed creating formpost data thrown

php - Mysql Select 查询 where 条件不能正常工作

php - mod_rewrite : subdomain to controller

.htaccess - 删除index.php并重定向到https子域

php - 使用本地时间信息和末尾的换行符写入错误日志

php - 如何在视觉 Composer 中使用短代码

php - 在 firefox 错误中下载 csv 文件

codeigniter - 通过 gmail 在 CodeIgniter 中发送电子邮件

php - 在 codeigniter 中从数据库中获取列记录