判断设备类型的地方有很多,比如在服务端通过 Nginx 或 Apache 等判断,在项目中通过 UserAgent 判断。这个网站上有各种开源的解决方案
现在的移动设备类型比较一致了,只需要判断安卓、苹果两种类型即可。

1. 通过 JavaScript 判断设备类型

对于静态页面构成的项目(比如 GitHub 的个人首页,只能上传静态页面),如果需要判断设备类型,那就得在终端设备上通过 JavaScript 实现。

Navigator 对象 详细文档参考这里:

Navigator 对象表示浏览器的状态和标识,允许 JavaScript 脚本查询其中的信息。其中的 userAgent 属性是一个声明了浏览器用于 HTTP 请求的用户代理头的字符串。下图是 Chrome 浏览器的 console 打印出来的信息:

对比 UserAgent

可以通过判断 navigator.userAgent 里面是否有某些值来判断设备类型。比如苹果手机有 iPhone 字段,Windows 系统的 PC 有 Windows 字段。

  • PC 版的 UserAgent 属性:userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
  • 模拟手机版的 UserAgent 属性:serAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1"

具体代码

通过正则表达式,可以把各种想识别的移动设备用 UserAgent 匹配出来。下面的例子(正则的 i 表示忽略大小写)匹配了安卓设备、苹果手机和平板、黑莓设备,如果终端确实是这些设备中的一种,则 is_pc 变量为 true,否则为 false。

var is_mobile = /Android|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent);

也可以利用字符串的 indexOf 方法去判断。

2. 通过 Nginx 判断设备类型

如果不同版本的项目是不同的团队做的,那在服务器进行跳转就很合适了。
下面的例子中,在 Nginx 配置文件中增加一个变量 $is_mobile 标志设备类型,通过正则表达式匹配 UserAgent 实现设备类型的判断。

server {    listen 80;  set $is_mobile no; # 默认电脑版if ($http_user_agent ~* '(Android|iPhone|iPod|iPad)') {set $is_mobile yes;}location / {if ($is_mobile = yes) {root /html/mobile;} else {root /html/mobile;}}
}  

3. 项目代码判断设备类型(以 PHP 为例)

PHP 通过 $_SERVER 储存各类客户设备的信息。其中的 $_SERVER['HTTP_USER_AGENT'] 是客户设备的 UserAgent。

3.1 通过 UserAgent 判断

PHP 中通过 UserAgent 判断设备类型的方法和 JavaScript 类似,可以用正则表达式简单实现,设备类型匹配到后 $is_mobile 变量为 true:

$is_mobile = preg_match("/Android|iPhone|iPad|iPod|BlackBerry/i", $userAgent);

3.2 通过 HTTP_X_WAP_PROFILE 判断

如果 $_SERVER 中有 HTTP_X_WAP_PROFILE 则一定是移动设备。

$is_mobile = isset ($_SERVER['HTTP_X_WAP_PROFILE']);

3.3 生产环境中往往综合以上方法来判断

function isMobile() { // 如果有 HTTP_X_WAP_PROFILE 则一定是移动设备if (isset ($_SERVER['HTTP_X_WAP_PROFILE'])) {return true;}// 判断手机发送的客户端标志 UserAgentif (isset ($_SERVER['HTTP_USER_AGENT'])) {return preg_match("/(" . implode('|', $clientkeywords) . ")/i", $_SERVER['HTTP_USER_AGENT'])) ? true : false;}
} 

4. 判断是否在微信中

微信的 UserAgent 中有一个标志 MicroMessenger,通过这个标识可以识别微信。

PHP 示例,在微信中时 $is_wx 为 true:

$is_wx = preg_match("/MicroMessenger/i", $_SERVER['HTTP_USER_AGENT']);

JavaScript 示例,在微信中时 is_wx 为 true:

var is_wx = /MicroMessenger/i.test(navigator.userAgent);

在不同位置(客户端的终端设备,服务端,项目代码中)判断设备类型(PC、手机、微信等)相关推荐

  1. pc 图片预览放大 端vue_企业为什么需要建设PC+手机微信三合一全网营销的网站呢...

    随着信息时代的发展,手机一步步的进入了我们的生活,渐渐的有很多东西都在从pc端过渡到手机端,我们在网购的时候会发现一系列的活动,比如说下载手机客户端就能免减多少钱或者抽奖这样的活动,这样在一定的程度上 ...

  2. PhotonServer,客户端发送请求给服务端,服务端解析请求,发送回客户端响应,客户端再解析服务端发过来的响应。

    1.(客户端发送给服务端)test中的构造参数并且发送 完整代码如下 test.cs using System; using System.Collections; using System.Coll ...

  3. grpc 客户端的context 服务端获取不到_MLamp;DEV[10] | gRPC的应用

    上一期和大家谈到了gRPC的快速开始,我么哪知道了gRPC是什么以及怎么快速启动,那么现在,我们来看看这个玩意具体内部是怎么运作的,这里我们同样以helloworld这个为例子来去谈.首先上期内容在这 ...

  4. 附件统一处理starter,含附件客户端和附件服务端

    文章目录 附件统一处理starter,可分别作为附件客户端和附件服务端使用 一 关于项目中附件的概述 二 概要描述 三 附件starter功能划分 3.1 附件服务器,真实的存储附件 3.1.1 为前 ...

  5. http 缓存分为客户端缓存和服务端缓存

    http 缓存分为客户端缓存和服务端缓存 1. 客户端缓存 客户端缓存指的是浏览器缓存, 浏览器缓存是最快的缓存, 因为它直接从本地获取(但有可能需要发送一个请求), 它的优势是可以减少网络流量, 加 ...

  6. 解决android客户端上传图片到服务端时,图片损坏的问题

    解决android客户端上传图片到服务端时,图片损坏的问题 参考文章: (1)解决android客户端上传图片到服务端时,图片损坏的问题 (2)https://www.cnblogs.com/cnbl ...

  7. Unity中进行网络通信:三:unity客户端和Unity服务端互相发消息

    目录 一.目的 1.想知道:Unity中进行网络通信:unity客户端和Unity服务端互相发消息 二.参考 1.unity3D中使用Socket进行数据通信(三) 三.操作:一:完成:在同一个Uni ...

  8. Linux Socket 两个客户端通信,服务端作为中转

    Socket 两个客户端通信,服务端作为中转 Socket两个客户端通信,服务端作为中转,通过sockket的通信原理,简单的做了一个以c语言写的服务端,与自己制作的Android app 与树莓派为 ...

  9. AjaxPro.NET使用,方便的在客户端直接调用服务端方法

    (一). 运行效果如下: (二). AjaxPro.NET简介 AjaxPro.NET是一个优秀的Ajax框架, 在实际应用中只要添加其DLL引用并进行简单的配置, 即可以非常方便的在客户端直接调用服 ...

  10. C# 客户端Client与服务端Server通信

    C# 客户端Client与服务端Server通信 服务端配置 服务端要先启动,等待客户端请求连接 客户端配置 客户端测试**(切记一定要先开启服务端,不然不能保证连接)**

最新文章

  1. 区分BundleVersion和BundleShortVersionString
  2. centos7安装tomcat8.5
  3. 在fedora23中安装virtualbox, 然后实现虚拟机irtualbox 或者 vmware 下的xp操作系统
  4. 网页中启动QQ的 XX 命令
  5. html鼠标变成小手_HTML 点击的链接,也叫超链接
  6. jvm学习笔记(3)——java对象的内存分配和对象的回收(GC)
  7. OpenShift 4 - Knative教程(2) 基于Revision/Tag/Traffic实现蓝绿部署和恢复发布
  8. MySQL | MySQL 数据库系统(四)- 数据库的备份与恢复
  9. centos下 将(jgp、png)图片转换成webp格式
  10. Akka Actor Inbox_信箱
  11. 2017程序员综合素质调研测试
  12. 虚拟服务器连接监控,方案:浅谈虚拟化平台的监控管理
  13. LOTO示波器---1G采样率的USB示波器OSCH02的优势
  14. php7isapi,如何选择PHP套件中ISAPI和FastCGI模式的版本?_护卫神
  15. 关于java中method.invoked 传入类型不一样的问题
  16. 调用marathon rest API
  17. 真实烟雾效果PS笔刷
  18. 回归分析及实际案例:预测鲍鱼年龄
  19. 江苏秦淮河清淤工程每天捞出五六吨漂浮物
  20. NB-IoT信息收集

热门文章

  1. 荣耀30sr升级鸿蒙,华为荣耀30怎么升级鸿蒙系统?
  2. linux服务器防攻击脚本,防止服务器被攻击的妙招(推荐)
  3. 用HTML和CSS3做个鱼,如何使用CSS和D3实现小鱼游动的交互动画(附代码)
  4. 前端 vue + element + vux
  5. JVM(2):垃圾收集器与gc
  6. 不打开Excel文件直接读取数据
  7. 广义表((a,b),c,d)表头和表尾分别是什么?
  8. Esp8266(WIFI模块)刷阿里云固件
  9. 软技能之基本沟通技巧
  10. 阅读Disentangling and Unifying Graph Convolutions for Skeleton-Based Action Recognition(CVPR2020)