通過PHP實(shí)現(xiàn)獲取訪問用戶IP
在php中自帶了一個(gè)非常的簡(jiǎn)單的獲取IP地址的全局變量,很多初學(xué)都獲取IP都使用它了,但是對(duì)于這些我們一般用法是滿足了,但是對(duì)于要求高精度這個(gè)函數(shù)還是不行的。
這個(gè)是最簡(jiǎn)單的方法,對(duì)于開了透明代理之類的是沒有辦法的,如果內(nèi)網(wǎng)訪問也不能讀取正確的外網(wǎng)IP,不過很省力就是了:
$ip = $_SERVER["REMOTE_ADDR"];
搞定~
上面方法用來取得客戶端的 IP 地址,但如果客戶端是使用代理服務(wù)器來訪問,那取到的就是代理服務(wù)器的 IP 地址,而不是真正的客戶端 IP 地址
要想透過代理服務(wù)器取得客戶端的真實(shí) IP 地址,就要使用 getenv("HTTP_X_FORWARDED_FOR") 來讀取。
但是如果客戶端沒有通過代理服務(wù)器來訪問,那么用getenv("HTTP_X_FORWARDED_FOR") 取到的值將是空的。
else if(getenv("HTTP_X_FORWARDED_FOR"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
表示如果getenv("HTTP_X_FORWARDED_FOR") 取到的值存在不為空(即客戶端使用代理服務(wù)器的情況下),則變量$ip等于getenv("HTTP_X_FORWARDED_FOR") 取到的真實(shí)IP值。
如果上面的else if(getenv("HTTP_X_FORWARDED_FOR"))取得的值為空(即沒有使用代理服務(wù)器),則不會(huì)執(zhí)行下面的$ip = getenv("HTTP_X_FORWARDED_FOR");這一行語句。
這種情況下已經(jīng)確認(rèn)客戶端沒有使用代理服務(wù)器,從而通過
else if(getenv("REMOTE_ADDR"))
$ip = getenv("REMOTE_ADDR");
這兩行語句獲得客戶端的IP地址也是真實(shí)的IP地址,根據(jù)經(jīng)驗(yàn)得出
function getIP()
{
static $realip;
if (isset($_SERVER)){
if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])){
$realip = $_SERVER["HTTP_X_FORWARDED_FOR"];
} else if (isset($_SERVER["HTTP_CLIENT_IP"])) {
$realip = $_SERVER["HTTP_CLIENT_IP"];
} else {
$realip = $_SERVER["REMOTE_ADDR"];
}
} else {
if (getenv("HTTP_X_FORWARDED_FOR")){
$realip = getenv("HTTP_X_FORWARDED_FOR");
} else if (getenv("HTTP_CLIENT_IP")) {
$realip = getenv("HTTP_CLIENT_IP");
} else {
$realip = getenv("REMOTE_ADDR");
}
}
return $realip;
}
另外如果我們想獲取更精準(zhǔn)的使用第三方是一個(gè)不錯(cuò)的方法哦
function get_onlineip() {
$ch = curl_init('http://www.ip138.com/ip2city.asp');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$a = curl_exec($ch);
preg_match('/[(.*)]/', $a, $ip);
return $ip[1];
}
這樣不管理代理還是什么都可以判斷IP地址哦
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
php簡(jiǎn)單實(shí)現(xiàn)無限分類樹形列表的方法
這篇文章主要介紹了php簡(jiǎn)單實(shí)現(xiàn)無限分類樹形列表的方法,實(shí)例分析了php通過數(shù)組實(shí)現(xiàn)樹形列表的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
php設(shè)計(jì)模式 Builder(建造者模式)
將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使用同樣的構(gòu)建過程可以創(chuàng)建不同的表示2011-06-06
PHP實(shí)現(xiàn)的激活用戶注冊(cè)驗(yàn)證郵箱功能示例
這篇文章主要介紹了PHP實(shí)現(xiàn)的激活用戶注冊(cè)驗(yàn)證郵箱功能,詳細(xì)分析了php郵件激活用戶所涉及的數(shù)據(jù)庫(kù)、郵件相關(guān)操作技巧,需要的朋友可以參考下2017-06-06
PHP 的異常處理、錯(cuò)誤的拋出及回調(diào)函數(shù)等面向?qū)ο蟮腻e(cuò)誤處理方法
PHP 5 提供了一種新的面向?qū)ο蟮腻e(cuò)誤處理方法,包括PHP 的異常處理、錯(cuò)誤的拋出及回調(diào)函數(shù)等面向?qū)ο蟮腻e(cuò)誤處理方法,需要了解更多的朋友可以參考下2012-12-12
php使用gettimeofday函數(shù)返回當(dāng)前時(shí)間并存放在關(guān)聯(lián)數(shù)組里
這篇文章主要介紹了php使用gettimeofday函數(shù)返回當(dāng)前時(shí)間并存放在關(guān)聯(lián)數(shù)組里的方法,涉及php中g(shù)ettimeofday函數(shù)的使用技巧,需要的朋友可以參考下2015-03-03
win7 64位系統(tǒng) 配置php最新版開發(fā)環(huán)境(php+Apache+mysql)
作為一個(gè)phper,基礎(chǔ)的php開發(fā)環(huán)境的配置是最基本的本事了,今天我們來看下在win7 64位系統(tǒng)中,如何配置php的開發(fā)環(huán)境呢2014-08-08

