首頁  >  文章  >  後端開發  >  PHP取得使用者的真實IP

PHP取得使用者的真實IP

WBOY
WBOY原創
2016-08-08 09:19:535045瀏覽

前幾天面試的時候被問到透過$_SERVER['SERVER_ADDR']取得的IP位址會有什麼問題?那肯定是「如果使用者透過的是代理 取得不到真正的ip位址」。還好面試官沒有進一步追問。那要如何取得用戶的真實IP位址呢?

分析

現在許多用戶並不是直接撥號上網,而是透過路由器或其他代理等方式存取網路。如果我們想要取得使用者客戶端的真實ip位址,就無法直接使用$_SERVER['SERVER_ADDR'],因為這樣取得的ip位址可能是192.168.1.99之類的**區域網路**ip,而不是用戶的公網ip位址。

慶幸的是,當我們的訪問請求通過公網路由或代理伺服器時,該終端將會在HTTP請求中添加X-Forwarded-For頭部信息,我們可以該請求頭來獲取客戶端的真實ip位址。

程式碼

<code><span><span><?php</span><span>/**
 * 获取用户的真实ip地址
 *<span> @return</span> string
 */</span><span><span>function</span><span>get_client_ip</span><span>()</span>{</span><span>$headers</span> = <span>array</span>(<span>'HTTP_X_REAL_FORWARDED_FOR'</span>, <span>'HTTP_X_FORWARDED_FOR'</span>, <span>'HTTP_CLIENT_IP'</span>, <span>'REMOTE_ADDR'</span>);
    <span>foreach</span> (<span>$headers</span><span>as</span><span>$h</span>){
        <span>$ip</span> = <span>$_SERVER</span>[<span>$h</span>];
        <span>// 有些ip可能隐匿,即为unknown</span><span>if</span> ( <span>isset</span>(<span>$ip</span>) && strcasecmp(<span>$ip</span>, <span>'unknown'</span>) ){
            <span>break</span>;
        }
    }
    <span>if</span>( <span>$ip</span> ){
        <span>// 可能通过多个代理,其中第一个为真实ip地址</span><span>list</span>(<span>$ip</span>) = explode(<span>', '</span>, <span>$ip</span>, <span>2</span>);
    }
    <span>/* 如果是服务器自身访问,获取服务器的ip地址(该地址可能是局域网ip)
    if ('127.0.0.1' == $ip){
        $ip = $_SERVER['SERVER_ADDR'];
    }
    */</span><span>return</span><span>$ip</span>;
}
<span>?></span></span></code>

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。

以上就介紹了PHP獲取用戶的真實IP,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:ngx_listening_s下一篇:ngx_listening_s