前幾天面試的時候被問到透過$_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教程有興趣的朋友有所幫助。