我的应用程序跟踪登录到该站点的用户的IP地址。跟踪在常规web服务器上运行良好(我们在hostgator上),但当我们切换到PaaS平台( pagodabox )时,似乎开始跟踪奇怪的IP地址。在与pagodabox支持人员交谈后,他们告诉我,正在拾取的IP代码点是pagodabox负载均衡器/路由器的IP,为了获得用户的实际IP地址,我必须使用HTTP_X_FORWARDED_FOR
我使用codeigniter的输入类函数$this->input->ip_address()来获取用户的IP地址。我看了看这个函数,注意到它们有一些检索HTTP_X_FORWARDED_FOR IP值的功能,但我不确定如何使用它。我是否必须在配置中更改/添加某些内容?
编辑:在几个用户指出我应该在负载均衡器的IP地址列表中添加的位置之后,一个新的问题出现了:如果IP列表频繁更改,我该怎么办?(即无静态IP,全部为动态IP)
发布于 2013-04-29 00:28:03
我相信你现在已经解决了这个问题,但我想我会把正确的答案发布出来,以供将来参考。我遇到了同样的问题(在亚马逊网络服务上使用负载均衡器和CodeIgniter应用程序)。正如您所指出的,使用HTTP_X_FORWARDED_FOR头可以很容易地在负载均衡器或其他分布式环境背后获得正确的IP。问题是我们如何在CodeIgniter中正确地实现这个解决方案?正如前面的答案所指出的:编写您自己的IP函数。这样做的问题是,如果在整个应用程序中调用ip_address()会怎么样?重写这个函数不是更好吗(用一个查看正确头部的函数)?CodeIgniter为此提供了一种方便的机制,这很方便:
解决方案是通过在/ CodeIgniter /CodeIgniter中创建一个名为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感兴趣,这应该无关紧要。至少对于亚马逊网络服务负载均衡器,HTTP_X_FORWARDED_FOR报头似乎总是包含正确的客户端IP。
发布于 2013-12-19 18:00:59
Oliver的解决方案是有效的,但在某些情况下,如果您知道正在使用的代理IP地址,则最好使用以下内容。编辑您的应用程序/config/config.php文件,使其包含以下内容:
$config['proxy_ips'] = '1.2.3.4, 2.3.4.5';还要注意,标头信息通常是不可靠的,不应用于安全敏感目的。例如,限制管理员用户仅使用一些白名单中的IP地址的情况并不少见。
发布于 2013-01-24 07:08:26
<?php
function getIPfromXForwarded()
{
$ipString = @getenv("HTTP_X_FORWARDED_FOR");
$addr = explode(",",$ipString);
return $addr[sizeof($addr)-1];
}
?> 试试这样的东西。看看它能不能用。用法:
<? echo getIPfromXForwarded(); ?>https://stackoverflow.com/questions/14491043
复制相似问题