摘要:
這是一個流傳很廣的使用方法,之前我也是深信不疑,最近在折騰自己的小網站PHP10086的時候,發現這個問題,
希望各位引以爲戒
正文
騰訊ip接口由於準確度比較高(支持到縣一級),使用上也比較廣泛。
使用騰訊api接口有兩種方法:
js版:
<script language="javascript" type="text/javascript" src="http://fw.qq.com/ipaddress"></script>
<script>document.write("你的IP是:"+IPData[0]+",來自:"+IPData[2]);</script>
對應的引申出服務端版,
PHP版的調用方法:
//方法2 直接獲得客戶端ip地址
function getIpPlace(){
$ip=file_get_contents("http://fw.qq.com/ipaddress");
$ip=str_replace('"',' ',$ip);
$ip2=explode("(",$ip);
$a=substr($ip2[1],0,-2);
$b=explode(",",$a);
return $b;
}
流傳很廣的說法都是說這兩種方法可以獲得客戶端IP(當然是指外網ip)
我這個本地測試這兩個方法都可以獲取到外網IP,解析我的ip信息:浙江杭州西湖區 電信
但是當我把這個兩個方法上傳到我的個人網站www.php10086.com的時候發現,
解釋一下:第一個IP是我個人網站服務器iP
第二個是我使用js版的ip接口獲取的值,
對比就發現這兩個方法獲取的ip不一樣,js版的獲取的是我外網ip
PHP版獲取的是我服務器自身的ip
原因解釋:
js版流程(js依賴於瀏覽器解析)
用戶---瀏覽器---本地host--外網ip--DNS解析--騰訊ip接口服務器
返回:外網ip(完全正確)
PHP版流程:
用戶---瀏覽器---本地host--外網ip--Dns解析-PHP10086服務器 ---騰訊ip接口服務器
返回:PHP10086服務器的IP
而本地測試都可以返回的原因是:
本地作爲服務器,最近訪問騰訊ip接口服務器的ip還是外網IP,所以兩個方法都可以返回外網IP
結論:PHP版騰訊ip接口獲取的IP是最近訪問騰訊ip接口服務器的IP
爲了證明這個,我又測試新浪的ip接口,測試結果和騰訊ip接口一樣,證明結論完全正確.
附帶一個DEMO:
demo地址:demo演示
服務器比較差,各位溫柔點
從這個接口對我得出的結論:
-
本地測試環境和真實生產環境還是有區別的
-
即使網上流傳很廣的方法也未必可靠,正如鄧爺爺說的實踐出真知,作爲程序員要又打破權威,質疑權威的膽識和行動
本文基於署名-非商業性使用 3.0許可協議發佈,歡迎轉載,演繹,但是必須保留本文的署名:PHP10086博客網(PHP淮北):http://www.php10086.com,也可以郵件與我聯繫。據說每個程序員都應該挖一口自己的井,希望各位支持我的"井":PHP10086博客網(PHP淮北):http://www.php10086.com。