2012-03-03 21 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; 
} 

我猜你試圖檢索遠程地址,上面的代碼可能會更健壯一點。