前幾天面試的時候被問到通過
$_SERVER['SERVER_ADDR']擷取到的IP地址會有什麼問題?那肯定是“如果使用者通過的是代理 擷取不到真正的ip地址”。還好面試官沒有進一步追問。那如何擷取使用者的真實IP地址呢?
分析
現在許多使用者並不是直接撥接,而是通過路由器或其他代理等方式訪問網路。如果我們想要擷取使用者用戶端的真實ip地址,就不能直接使用$_SERVER['SERVER_ADDR'],因為這樣擷取到的ip地址可能是192.168.1.99之類的**區域網路**ip,而不是使用者的公網ip地址。
慶幸的是,當我們的訪問請求通過公網路由或Proxy 伺服器時,該終端將會在HTTP請求中添加X-Forwarded-For頭部資訊,我們可以該要求標頭來擷取用戶端的真實ip地址。
代碼
/** * 擷取使用者的真實ip地址 * @return string */functionget_client_ip(){$headers = array('HTTP_X_REAL_FORWARDED_FOR', 'HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP', 'REMOTE_ADDR'); foreach ($headersas$h){ $ip = $_SERVER[$h]; // 有些ip可能隱匿,即為unknownif ( isset($ip) && strcasecmp($ip, 'unknown') ){ break; } } if( $ip ){ // 可能通過多個代理,其中第一個為真實ip地址list($ip) = explode(', ', $ip, 2); } /* 如果是伺服器自身訪問,擷取伺服器的ip地址(該地址可能是區域網路ip) if ('127.0.0.1' == $ip){ $ip = $_SERVER['SERVER_ADDR']; } */return$ip;}?>
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
以上就介紹了PHP擷取使用者的真實IP,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。