程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 怎麼判斷訪問端是電腦還是手機?

怎麼判斷訪問端是電腦還是手機?

編輯:關於PHP編程

       網上現在有三種觀點, 一種是基於浏覽器發送的 User-Agent, 但明顯這種方法是行不通的, 雖然有人列出了大多數的手機發送的User-Agent, 但依然會有很多手機無法識別, 甚至有些手機浏覽器不發送User-Agent, 而且也不能保證以後就不會出新牌子.

      下面是一個php的例子, 看過之後你就會知道有多麼不可靠.

      1. function is_wap(){

      2. $ua = strtolower($_SERVER['HTTP_USER_AGENT']);

      3. $uachar = "/(nokia|sony|ericsson|mot|samsung|sgh|lg|sie|philips|panasonic|alcatel|lenovo|cldc|midp|wap|mobile)/i";

      4. if(($ua == '' || preg_match($uachar, $ua))&& !strpos(strtolower($_SERVER['REQUEST_URI']),'wap')){

      5. return true;

      6. }else{

      7. return false;

      8. }

      9. }

      另外一種是判斷HTTP_ACCEPT, 這種應該相對可靠一點, 不過HTTP_ACCEPT是非常復雜的, 如果一般的不支持html的浏覽器還好說, 你只要判斷浏覽器支持wml並且不支持html就可以, 但如果浏覽器同時支持wml和html那就難辦了, 低端手機可能會將wml放到html的前面, 但是很多高端手機或者智能手機對html的支持很好, 所以html也會出現在wml前面.

      這是黑莓手機發送的HTTP_ACCEPT

      application/vnd.rim.html,

      text/html,

      application/vnd.wap.xhtml+xml,

      text/vnd.sun.j2me.app-descriptor,

      image/vnd.rim.png,image/jpeg,

      application/x-vnd.rim.pme.b,

      application/vnd.rim.ucs,

      image/gif;anim=1,

      application/vnd.rim.jscriptc;v=0-8-8,

      application/x-javascript,

      application/vnd.rim.css;v=1,

      text/css;media=handheld,

      application/vnd.wap.wmlc;q=0.9,

      application/vnd.wap.wmlscriptc;q=0.7,

      text/vnd.wap.wml;q=0.7,

      */*;q=0.5

      誇張吧? 不過的確是很標准的, 開發人員可以根據這個得到很多信息, 但很多手機都沒這麼標准的, 如果你查看IE或者FF的HTTP_ACCEPT你會發現它很短.

      text/html,

      application/xhtml+xml,

      application/xml;q=0.9,

      */*;q=0.8

      同樣, 給你個php的例子.

      if (isset($_SERVER['HTTP_ACCEPT']) &&

      (strpos($_SERVER['HTTP_ACCEPT'],'vnd.wap.wml')!==FALSE)

      && (strpos($_SERVER['HTTP_ACCEPT'],'text/html')===FALSE ||

      (strpos($_SERVER['HTTP_ACCEPT'],'vnd.wap.wml') <

      strpos($_SERVER['HTTP_ACCEPT'],'text/html'))

      )) {//手機訪問

      readfile('index.wml');

      } else readfile('index.htm');

      原理:如果浏覽器支持WML、而且[不支持HTML]或[WML優先於HTML],則判定為手機。但實際上這個原理是不正確的.

      還有一種是說判斷網關或者IP什麼的, 但我個人認為這個很不可靠, 手機的聯網方式很多, 比如我開發的時候就是用模擬器的.這個應該不用什麼例子了, REMOTE_ADDR 就足夠了.

      以上是我今天上午的工作成果, 但實際上還是沒有找到完美的解決方案, 先寫這麼多, 有問題請補充或者發送消息給我, 如果你有更好的辦法希望可以分享給我, 謝謝.

      最近做一個手機查詢系統,自然就牽扯到了此問題,那我就根據對wap的認識淺談下通過php判斷用戶訪問方式是通過wap訪問還是電腦直接訪問。

      首先說最根本的解決方法:

      手 機訪問時,會附帶發送user-agent信息,這個信息裡面會有手機號碼信息,那麼如果能取得手機號碼,則可以肯定是通過手機wap訪問的。但是目前中 國移動已經屏蔽了user-agent信息,所以獲取不到手機號碼。有關系的朋友可以聯系移動公司,把wap網站服務器的ip提交給中國移動,加入白名單 後即可取得ua信息。目前中國聯通可以直接取到手機號,對聯通用戶此方案可完美實施。

      接下來說我的解決方案:

      手機訪問,原理是手機通過移動公司的代理服務器進行的訪問。那麼我們就可以理解是一台普通電腦使用了代理服務器。當手機通過代理服務器訪問的時候,http頭信息會毫無疑問的包含一個信息:via。這個信息提供了有價值的判斷信息。

      例如河南移動取得的via信息是:

      http/1.1 hazz-b-gw001-wap(infox-wisg, huawei technologies)

      河南聯通的via信息是:

      zxwap gateway,zte technologies

      其他各省的http頭信息和這個大同小異,判斷是否手機訪問的方案就出來 了:獲取http的via信息字符串看是否包含wap字符,如果有則是通過手機訪問。這樣做的結果是沒有人能偽造手機訪問,判斷絕對准確。自然,這樣對於 網上流行的手機wap模擬器也做了屏蔽—-從根本上屏蔽。

      操作代碼也很簡單:

      // check if wap by xhat

      function check_wap() {

      return stristr($_SERVER['HTTP_VIA'],"wap") ? true : false;

      }

      // check over

      從我查閱的資料來看,目前此方法應該是迄今互聯網上准確率最高、最簡單的判斷手機訪問方法。

      以上的方法可以實現判斷訪問來源是手機還是電腦,但有一個問題就是,只能通過手機才能訪問,支持WAP的浏覽器和手機模擬器也不能訪問,這給測試帶來了麻煩,也有點限制死了。

      下面的方案是:

      通過判斷浏覽器代理標識符,判斷是否是支持WAP的浏覽器來決定訪問頁面。這有一個缺點就是不可能全部的列出所有手機的浏覽器標識符與所支持的浏覽器標識符。

      下面看看實現的代碼:

      function check_wap()

      {

      if (strpos(strtoupper($_SERVER['HTTP_ACCEPT']),"VND.WAP.WML") > 0)

      {

      // Check whether the browser/gateway says it accepts WML.

      $br = "WML";

      }

      else

      {

      $browser=substr(trim($_SERVER['HTTP_USER_AGENT']),0,4);

      if ($browser=="Noki" || // Nokia phones and emulators

      $browser=="Eric" || // Ericsson WAP phones and emulators

      $browser=="WapI" || // Ericsson WapIDE 2.0

      $browser=="MC21" || // Ericsson MC218

      $browser=="AUR" || // Ericsson R320

      $browser=="R380" || // Ericsson R380

      $browser=="UP.B" || // UP.Browser

      $browser=="WinW" || // WinWAP browser

      $browser=="UPG1" || // UP.SDK 4.0

      $browser=="upsi" || // another kind of UP.Browser ??

      $browser=="QWAP" || // unknown QWAPPER browser

      $browser=="Jigs" || // unknown JigSaw browser

      $browser=="Java" || // unknown Java based browser

      $browser=="Alca" || // unknown Alcatel-BE3 browser (UP based?)

      $browser=="MITS" || // unknown Mitsubishi browser

      $browser=="MOT-" || // unknown browser (UP based?)

      $browser=="My S" ||// unknown Ericsson devkit browser ?

      $browser=="WAPJ" || // Virtual WAPJAG www.wapjag.de

      $browser=="fetc" || // fetchpage.cgi Perl script from www.wapcab.de

      $browser=="ALAV" || // yet another unknown UP based browser ?

      $browser=="Wapa" || // another unknown browser (Web based "Wapalyzer"?)

      $browser=="Oper") // Opera

      {

      $br = "WML";

      }

      else

      {

      $br = "HTML";

      }

      }

      if($br == "WML")

      {

      return TRUE;

      }

      else

      {

      return FALSE;

      }

      }

      if(!check_wap())

      {

      Header("Location: http://www.xker.com/");

      exit();

      }

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved