注意:未定义索引:HTTP_X_FORWARDED_FOR函数错误

时间:2012-03-03 18:58:21

标签: php

我收到通知:未定义索引: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'] );
}

5 个答案:

答案 0 :(得分: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的真相,所以你会错过这个。

答案 1 :(得分: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
    }
}

答案 2 :(得分: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'] : '';
}

答案 3 :(得分: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;
}

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

答案 4 :(得分:0)

getenv('HTTP_X_FORWARDED_FOR')如果$ _SERVER数组中不存在该变量,则返回false;而如果未设置该变量,则$ _SERVER ['HTTP_X_FORWARDED_FOR']返回未定义的索引。