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

來源:互聯網
上載者:User

   網上現在有三種觀點, 一種是基於瀏覽器發送的 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資訊。目前中國聯通可以直接取到手機號,對聯通使用者此方案可完美實施。

  接下來說我的解決方案:

  手機訪問,原理是手機通過移動公司的Proxy 伺服器進行的訪問。那麼我們就可以理解是一台普通電腦使用了Proxy 伺服器。當手機通過Proxy 伺服器訪問的時候,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();

  }

相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。