如何判斷是手機仍是電腦在訪問網站?javascript
網上如今有三種觀點, 一種是基於瀏覽器發送的 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 就足夠了.
以上是我今天上午的工做成果, 但實際上仍是沒有找到完美的解決方案, 先寫這麼多, 有問題請補充或者發送消息給我, 若是你有更好的辦法但願能夠分享給我, 謝謝.
以上來自:http://zhidao.baidu.com/question/70781857.htmlphp
最近作一個手機查詢系統,天然就牽扯到了此問題,那我就根據對wap的認識淺談下經過php判斷用戶訪問方式是經過wap訪問仍是電腦直接訪問。
首先說最根本的解決方法:
手 機訪問時,會附帶發送user-agent信息,這個信息裏面會有手機號碼信息,那麼若是能取得手機號碼,則能夠確定是經過手機wap訪問的。可是目前中 國移動已經屏蔽了user-agent信息,因此獲取不到手機號碼。有關係的朋友能夠聯繫移動公司,把wap網站服務器的ip提交給中國移動,加入白名單 後便可取得ua信息。目前中國聯通能夠直接取到手機號,對聯通用戶此方案可完美實施。
接下來講個人解決方案:
手機訪問,原理是手機經過移動公司的代理服務器進行的訪問。那麼咱們就能夠理解是一臺普通電腦使用了代理服務器。當手機經過代理服務器訪問的時候,http頭信息會毫無疑問的包含一個信息:via。這個信息提供了有價值的判斷信息。
例如河南移動取得的via信息是:css
http/1.1 hazz-b-gw001-wap(infox-wisg, huawei technologies)
河南聯通的via信息是:html
zxwap gateway,zte technologies
其餘各省的http頭信息和這個大同小異,判斷是否手機訪問的方案就出來 了:獲取http的via信息字符串看是否包含wap字符,若是有則是經過手機訪問。這樣作的結果是沒有人能僞造手機訪問,判斷絕對準確。天然,這樣對於 網上流行的手機wap模擬器也作了屏蔽—-從根本上屏蔽。
操做代碼也很簡單:java
// 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.chongwen.com/info/story.html");
exit();
}app