2012-03-03 23 views
4

我得到通知HTTP_X_FORWARDED_FOR错误:未定义指数:HTTP_X_FORWARDED_FOR在下面的功能:公告:未定义的索引:在功能

function _ip() 
{ 
    return (preg_match("/^([d]{1,3}).([d]{1,3}).([d]{1,3}).([d]{1,3})$/", $_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']); 
} 

回答

15

您应该使用getenv()方法而不是$ _SERVER。

function _ip() 
{ 
    if (preg_match("/^([d]{1,3}).([d]{1,3}).([d]{1,3}).([d]{1,3})$/", getenv('HTTP_X_FORWARDED_FOR')) 
    { 
     return getenv('HTTP_X_FORWARDED_FOR'); 
    } 
    return getenv('REMOTE_ADDR'); 
} 

另外,我想只有$ip = getenv('REMOTE_ADDR')坚持垃圾邮件发送者可以在HTTP_X_FORWARDED_FOR头自己设定自己想要,而他们不能改变任何东西REMOTE_ADDR。问题是,“好”的代理人说出了HTTP_X_FORWARDED_FOR的真相,所以你会错过的。

+2

尽管“好”的代理可能会给你一个有效的X-Forwarded-For,但这些头文件中的很多值将会是你不想要的,比如RFC1918私有IP。 – duskwuff 2012-03-03 19:25:14

3

$ _ SERVER [“HTTP_X_FORWARDED_FOR”]不数组中存在。您可以用print_r($_SERVER)进行确认。在使用它之前,您需要测试数组索引的存在。

function _ip() 
{ 
    if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
     return (preg_match("/^([d]{1,3}).([d]{1,3}).([d]{1,3}).([d]{1,3})$/", $_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']); 
    } else { 
     return null; //something else 
    } 
} 
1

目前没有标头。在访问它之前,您需要检查它是否存在。

function _ip() 
{ 
    if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) { 
     if (preg_match("/^([d]{1,3}).([d]{1,3}).([d]{1,3}).([d]{1,3})$/", $_SERVER['HTTP_X_FORWARDED_FOR']) 
      return $_SERVER['HTTP_X_FORWARDED_FOR']; 
     } 
    } 
    return isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : ''; 
} 
0

显然这是因为该索引不存在于$ _SERVER数组中。你可以避免做的通知

if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) { 
    // your code here 
} else { 
    if(isset($_SERVER['REMOTE_ADDR'])) 
    return $_SERVER['REMOTE_ADDR']; 
    else 
    return FALSE; 
} 

我猜你试图检索远程地址,上面的代码可能会更健壮一点。