如何判断当前是手机访问还是电脑访问呢?

ericllzh 2009-11-09 09:02:52
网上现在有三种观点, 一种是基于浏览器发送的 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 就足够了.



我从网上找到这些,不知道还有方法吗/
...全文
1198 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
其实通过 HTTP_ACCEPT 来判断最好!
因为很多山寨手机根本就没有HTTP_USER_AGENT
pengziyoufeixiang 2010-06-03
  • 打赏
  • 举报
回复
学习了...
l2x11 2009-11-17
  • 打赏
  • 举报
回复
关注中。。。。。。。
床上等您 2009-11-17
  • 打赏
  • 举报
回复
mark
iisbsd 2009-11-17
  • 打赏
  • 举报
回复
反过来想一下,电脑上的浏览器其实很少,如果你希望95%得准确率的话,IE+Firefox就足够了,如果希望更高,也就再加上4、5种。

电脑上的浏览器不发User Agent得比较少见,可以忽略。^_^
long_hh 2009-11-17
  • 打赏
  • 举报
回复
回帖赚积分
dahaidao 2009-11-16
  • 打赏
  • 举报
回复
让操作的人自己选择好了.这样肯定不容易搞错.
GZ_Xing 2009-11-16
  • 打赏
  • 举报
回复
学习了。。
openui 2009-11-15
  • 打赏
  • 举报
回复
学习 - --
kai8341 2009-11-12
  • 打赏
  • 举报
回复
学习 - -
do_fork 2009-11-10
  • 打赏
  • 举报
回复
1. 是否支持js,
2. 浏览器有效区域分辨率
3. 某段js执行花费的时间
4. user-agent

不过无法做到100%正确,这些数据都是可以伪造的
Piscesconan 2009-11-10
  • 打赏
  • 举报
回复
学习~~~
ericllzh 2009-11-10
  • 打赏
  • 举报
回复
还有吗??
骄傲青蛙 2009-11-09
  • 打赏
  • 举报
回复
不如你直接通过浏览器来判断系统是什么
骄傲青蛙 2009-11-09
  • 打赏
  • 举报
回复
关注
bookmoth 2009-11-09
  • 打赏
  • 举报
回复
占地学习。
话说……确定客户端类型之后,下一步会有什么操作?
手机浏览器支持javascript么?

4,251

社区成员

发帖
与我相关
我的任务
社区描述
国内外优秀PHP框架讨论学习
社区管理员
  • Framework
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧