關於騰訊ip接口一個流傳很廣的錯誤用法

摘要:

這是一個流傳很廣的使用方法,之前我也是深信不疑,最近在折騰自己的小網站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演示

服務器比較差,各位溫柔點

 
從這個接口對我得出的結論:
  1. 本地測試環境和真實生產環境還是有區別的
  2. 即使網上流傳很廣的方法也未必可靠,正如鄧爺爺說的實踐出真知,作爲程序員要又打破權威,質疑權威的膽識和行動
Technorati 標籤: 騰訊IP接口,js ip接口,PHP ip
本文基於署名-非商業性使用 3.0許可協議發佈,歡迎轉載,演繹,但是必須保留本文的署名:PHP10086博客網(PHP淮北):http://www.php10086.com,也可以郵件與我聯繫。據說每個程序員都應該挖一口自己的井,希望各位支持我的"井":PHP10086博客網(PHP淮北):http://www.php10086.com
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章