在php中自帶了一個(gè)非常的簡單的獲取IP地址的全局變量,很多初學(xué)都獲取IP都使用它了,但是對(duì)于這些我們一般用法是滿足了,但是對(duì)于要求高精度這個(gè)函數(shù)還是不行的.
這個(gè)是最簡單的方法,對(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地址.
新聞熱點(diǎn)
疑難解答