判断移动端和pc端访问手机端访问

TP3.2.x判断手机端访问并设置默认访问模块的方法 - ThinkPHP框架
手机端访问时调用Wap手机模块,实现在手机端访问时展示出手机网站,无需跳转域名首先我们在./Application/Common/Conf/ 目录下建立两个公共配置文件:config.php 和config_wap.php
config.php 中:return&array(
&&&&'DEFAULT_MODULE'=&'Index',
&&&&'DEFAULT_CONTROLLER'=&'Index',
&&&&'DEFAULT_ACTION'=&'index',
)config_wap.php 中:return&array(
&&&&'DEFAULT_MODULE'=&'Wap',
&&&&'DEFAULT_CONTROLLER'=&'Index',
&&&&'DEFAULT_ACTION'=&'index',
)然后在入口文件 index.php 中加入手机端判断方法(建议放到最下面):function&is_mobile_request(){
&&&&$_SERVER['ALL_HTTP']&=&isset($_SERVER['ALL_HTTP'])&?&$_SERVER['ALL_HTTP']&:&'';
&&&&$mobile_browser&=&'0';
&&&&if(preg_match('/(up.browser|up.link|mmp|symbian|smartphone|midp|wap|phone|iphone|ipad|ipod|android|xoom)/i',&strtolower($_SERVER['HTTP_USER_AGENT'])))
&&&&&&&&$mobile_browser++;
&&&&if((isset($_SERVER['HTTP_ACCEPT']))&and&(strpos(strtolower($_SERVER['HTTP_ACCEPT']),'application/vnd.wap.xhtml+xml')&!==&false))
&&&&&&&&$mobile_browser++;
&&&&if(isset($_SERVER['HTTP_X_WAP_PROFILE']))
&&&&&&&&$mobile_browser++;
&&&&if(isset($_SERVER['HTTP_PROFILE']))
&&&&&&&&$mobile_browser++;
&&&&&&&&$mobile_ua&=&strtolower(substr($_SERVER['HTTP_USER_AGENT'],0,4));
&&&&&&&&$mobile_agents&=&array(
&&&&&&&&&&&&'w3c&','acs-','alav','alca','amoi','audi','avan','benq','bird','blac',
&&&&&&&&&&&&'blaz','brew','cell','cldc','cmd-','dang','doco','eric','hipt','inno',
&&&&&&&&&&&&'ipaq','java','jigs','kddi','keji','leno','lg-c','lg-d','lg-g','lge-',
&&&&&&&&&&&&'maui','maxo','midp','mits','mmef','mobi','mot-','moto','mwbp','nec-',
&&&&&&&&&&&&'newt','noki','oper','palm','pana','pant','phil','play','port','prox',
&&&&&&&&&&&&'qwap','sage','sams','sany','sch-','sec-','send','seri','sgh-','shar',
&&&&&&&&&&&&'sie-','siem','smal','smar','sony','sph-','symb','t-mo','teli','tim-',
&&&&&&&&&&&&'tosh','tsm-','upg1','upsi','vk-v','voda','wap-','wapa','wapi','wapp',
&&&&&&&&&&&&'wapr','webc','winw','winw','xda','xda-'
&&&&&&&&);
&&&&&if(in_array($mobile_ua,&$mobile_agents))
&&&&&&&&&&$mobile_browser++;
&&&&&if(strpos(strtolower($_SERVER['ALL_HTTP']),&'operamini')&!==&false)
&&&&&&&&&&$mobile_browser++;
&&&&&//&Pre-final&check&to&reset&everything&if&the&user&is&on&Windows&&
&&&&&if(strpos(strtolower($_SERVER['HTTP_USER_AGENT']),&'windows')&!==&false)
&&&&&&&&&&$mobile_browser=0;
&&&&&//&But&WP7&is&also&Windows,&with&a&slightly&different&characteristic&&
&&&&&if(strpos(strtolower($_SERVER['HTTP_USER_AGENT']),&'windows&phone')&!==&false)
&&&&&&&&&&$mobile_browser++;
&&&&&if($mobile_browser&0)&&
&&&&&&&&&&return&
&&&&&&&&&&return&
}然后,我们开始用关键的APP_STATUS来调用不同的模块:
在index.php文件中的21行后面也就是“定义应用目录”结束后,加入代码:if(is_mobile_request()){
&&&&define('APP_STATUS','config_wap');
&&&&define('APP_STATUS','Index');
}大功告成。
参考文档:http://document.thinkphp.cn/manual_3_2.html#load_config
marshalmackes
积分:2640
ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。5549人阅读
在有些时候,我们需要判断当前是否是移动端访问,比如,一个页面分PC端和移动端,这时候就需要判断是否是移动端访问,话不多说,直接上代码:如果是移动端访问就跳转到http://m.baidu.com/,如果是PC访问不变。
$(function(){
if(navigator.userAgent.match(/mobile/i)) {
top.location='http://m.baidu.com/';
检测是否在微信访问的方法,当在非微信端访问是会出现以下提示页面:
具体实现是在需要判断的页面加入以下JS:
var ua = navigator.userAgent.toLowerCase();
var isWeixin = ua.indexOf('micromessenger') != -1;
var isAndroid = ua.indexOf('android') != -1;
var isIos = (ua.indexOf('iphone') != -1) || (ua.indexOf('ipad') != -1);
if (!isWeixin) {
document.head.innerHTML = '&title&抱歉,出错了&/title&&meta charset="utf-8"&&meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=0"&&link rel="stylesheet" type="text/css" href="https://res.wx.qq.com/open/libs/weui/0.4.1/weui.css"&';
document.body.innerHTML = '&div class="weui_msg"&&div class="weui_icon_area"&&i class="weui_icon_info weui_icon_msg"&&/i&&/div&&div class="weui_text_area"&&h4 class="weui_msg_title"&请在微信客户端打开链接&/h4&&/div&&/div&';}博客分类:
我们现在做的项目,移动端和PC端网站访问的是同一套接口,那么如何在接口中区分是手机访问还是PC短访问呢?
核心思想:根据请求头(request header)来判断,如何请求没有header或伪造user agent则无法判断.
先看一些user agent的实例:
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/ Firefox/35.0
Mozilla/5.0 (iP CPU iPhone OS 8_1_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) (Engine, like URL) Mobile/12B440 MicroMessenger/6.0.1 NetType/3G+
Mozilla/5.0 (L U; Android 4.1.1; en- HTC T528d) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 MicroMessenger/6.0.2.58_r NetType/WIFI
Mozilla/5.0 (L U; Android 4.2.2; zh-CN; 2013023 Build/HM2013023) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.9.5.489 U3/0.8.0 Mobile Safari/533.1
Opera/9.80 (Android 2.3.7; L Opera Mobi/46154) Presto/2.11.355 Version/12.10
Mozilla/5.0 (L U; Android 4.2.1; zh- HUAWEI G700-U00 Build/HuaweiG700-U00) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 V1_AND_SQ_5.3.1_196_YYB_D QQ/5.3.1.2335 NetType/WIFI
Mozilla/5.0 (L U; Android 4.0.4; zh- HS-EG906 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 MicroMessenger/5.3.1.67_r
Mozilla/5.0 (L U; Android 4.4.2; zh- GT-I9500 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko)Version/4.0 MQQBrowser/5.0 QQ-Manager Mobile Safari/537.36
以下是我封装的一套方法
ClientOsInfo 是用于保存访问设备信息的,结构如下(省略getter,setter):
public class ClientOsInfo {
* 比如 Android_3.0
private String osTypeV
* Pad或Phone
private String deviceT
private String osT
* 只是版本号,例如"4.1.1"
private String userA
* 是否是移动设备
public boolean isMobile(){
return (!ValueWidget.isNullOrEmpty(this.deviceType));
* 当移动端(手机或Pad)访问网页时获取移动端操作系统信息
* @param request
public static ClientOsInfo getMobileOsInfo(HttpServletRequest request){
String userAgent=request.getHeader("user-agent");
if(ValueWidget.isNullOrEmpty(userAgent)){
userAgent=request.getHeader("User-Agent");
ClientOsInfo info= HeaderUtil.getMobilOS(userAgent);
info.setUserAgent(userAgent);
核心工具类:用于解析user agent
package com.common.
import java.util.regex.M
import java.util.regex.P
import com.common.bean.ClientOsI
import com.string.widget.util.ValueW
* @author huangwei
public class HeaderUtil {
public static final String OSTYPE_ANDROID="Android";
public static final String OSTYPE_IOS="Ios";
public static final String OSTYPE_WP="WINDOWS PHONE";
public static final String OSTYPE_BLACKBERRY="BLACKBERRY";
public static final String DEVICE_TYPE_PAD="Pad";
public static final String DEVICE_TYPE_PHONE="Phone";
* 校验渠道终端版本号是否合法,eg:0.0.0.3
* @param clientVersion
* @return true--&合法 ;false--&非法
public static boolean verifyClientVersion(String clientVersion) {
boolean result = Pattern.matches("[\\d\\.]+", clientVersion);
if (result) {
result = Pattern.matches("^\\d\\.\\d\\.\\d\\.\\d$", clientVersion);
* 根据useragent和手机厂商查手机型号
* @param UA
* @param vendor
public static String getMobModel(String UA, String operatingSystem) {
if (UA == null) {
// 存放正则表达式
String rex = "";
// 苹果产品
if (operatingSystem.indexOf("IOS") != -1) {
if (UA.indexOf("IPAD") != -1) {// 判断是否为ipad
return "IPAD";
if (UA.indexOf("IPOD") != -1) {// 判断是否为ipod
return "IPOD";
if (UA.indexOf("IPONE") != -1) {// 判断是否为ipone
return "IPONE";
return "IOS DEVICE";
// 安卓系统产品
if (operatingSystem.indexOf("ANDROID") != -1) {
String re = "BUILD";
rex = ".*" + ";" + "(.*)" +
Pattern p = Pattern.compile(rex, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(UA);
boolean rs = m.find();
System.out.println("Mobil Model is" + m.group(1));
return m.group(1);
* 判断手机的操作系统 IOS/android/windows phone/BlackBerry
* @param UA
public static ClientOsInfo getMobilOS(String UA) {
UA=UA.toUpperCase();
if (UA == null) {
ClientOsInfo osInfo=new
ClientOsInfo();
// 存放正则表达式
String rex = "";
// IOS 判断字符串
String iosString = " LIKE MAC OS X";
if (UA.indexOf(iosString) != -1) {
if(isMatch(UA, "\\([\\s]*iPhone[\\s]*;", Pattern.CASE_INSENSITIVE)){
osInfo.setDeviceType(DEVICE_TYPE_PHONE);
}else if(isMatch(UA, "\\([\\s]*iPad[\\s]*;", Pattern.CASE_INSENSITIVE)){
osInfo.setDeviceType(DEVICE_TYPE_PAD);
rex = ".*" + "[\\s]+(\\d[_\\d]*)" + iosS
Pattern p = Pattern.compile(rex, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(UA);
boolean rs = m.find();
String osVersion= m.group(1).replace("_", ".");
osInfo.setVersion(osVersion);
System.out.println("Mobil OS is" + " IOS" +osVersion);
osInfo.setOsTypeVersion(OSTYPE_IOS+"_" + osVersion);
System.out.println("IOS");
osInfo.setOsTypeVersion(OSTYPE_IOS);
osInfo.setOsType(OSTYPE_IOS);
return osI
// Android 判断
String androidString = "ANDROID";
if (UA.indexOf(androidString) != -1) {
if(isMatch(UA, "\\bMobi", Pattern.CASE_INSENSITIVE)){
osInfo.setDeviceType(DEVICE_TYPE_PHONE);
osInfo.setDeviceType(DEVICE_TYPE_PAD);
rex = ".*" + androidString + "[\\s]*(\\d*[\\._\\d]*)";
Pattern p = Pattern.compile(rex, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(UA);
boolean rs = m.find();
String version=m.group(1).replace("_", ".");
osInfo.setVersion(version);
System.out.println("Mobil OS is " + OSTYPE_ANDROID + version);
osInfo.setOsTypeVersion(OSTYPE_ANDROID+"_" + version);
System.out.println("Android");
osInfo.setOsTypeVersion(OSTYPE_ANDROID);
osInfo.setOsType(OSTYPE_ANDROID);
return osI
// windows phone 判断
String wpString = "WINDOWS PHONE";
if (UA.indexOf(wpString) != -1) {
rex = ".*" + wpString + "[\\s]*[OS\\s]*([\\d][\\.\\d]*)";
Pattern p = Pattern.compile(rex, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(UA);
boolean rs = m.find();
System.out.println("Mobil OS is " + OSTYPE_WP + m.group(1));
String version=m.group(1);
osInfo.setVersion(version);
osInfo.setOsTypeVersion(OSTYPE_WP+"_" + version);
System.out.println("WINDOWS PHONE");
osInfo.setOsTypeVersion(OSTYPE_WP);
osInfo.setOsType(OSTYPE_WP);
return osI
// BlackBerry 黑莓系统判断
String bbString = "BLACKBERRY";
if (UA.indexOf(bbString) != -1) {
rex = ".*" + bbString + "[\\s]*([\\d]*)";
Pattern p = Pattern.compile(rex, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(UA);
boolean rs = m.find();
System.out.println("Mobil OS is" + " BLACKBERRY " + m.group(1));
String version=m.group(1);
osInfo.setVersion(version);
osInfo.setOsTypeVersion(OSTYPE_BLACKBERRY+"_" + version);
System.out.println("BLACKBERRY");
osInfo.setOsTypeVersion(OSTYPE_BLACKBERRY);
osInfo.setOsType(OSTYPE_BLACKBERRY);
return osI
if(UA.contains("LINUX")){//android
if(isMatch(UA, "\\bMobi", Pattern.CASE_INSENSITIVE)){
osInfo.setDeviceType(DEVICE_TYPE_PHONE);
osInfo.setDeviceType(DEVICE_TYPE_PAD);
Pattern p = Pattern.compile("U;\\s*(Adr[\\s]*)?(\\d[\\.\\d]*\\d)[\\s]*;",Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(UA);
boolean result = m.find();
String find_result =
if (result)
find_result = m.group(2);
if(ValueWidget.isNullOrEmpty(find_result)){
osInfo.setOsTypeVersion(OSTYPE_ANDROID);
return osI
osInfo.setVersion(find_result);
osInfo.setOsTypeVersion(OSTYPE_ANDROID+"_"+find_result);
return osI
//UCWEB/2.0 (iOS; U; iPh OS 4_3_2; zh-CN; iPh4)
if(UA.matches(".*((IOS)|(iPAD)).*(IPH).*")){
if(isMatch(UA, "[\\s]*iPh[\\s]*", Pattern.CASE_INSENSITIVE)){
osInfo.setDeviceType(DEVICE_TYPE_PHONE);
osInfo.setDeviceType(DEVICE_TYPE_PAD);
Pattern p = Pattern.compile("U;\\s*(IPH[\\s]*)?(OS[\\s]*)?(\\d[\\._\\d]*\\d)[\\s]*;",Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(UA);
boolean result = m.find();
String find_result =
if (result)
find_result = m.group(3);
if(ValueWidget.isNullOrEmpty(find_result)){
osInfo.setOsTypeVersion(OSTYPE_IOS);
osInfo.setOsType(OSTYPE_IOS);
return osI
String version=find_result.replace("_", ".");
osInfo.setVersion(version);
osInfo.setOsTypeVersion(OSTYPE_IOS+"_"+version);
osInfo.setOsType(OSTYPE_IOS);
return osI
return osI
public static boolean isMatch(String source,String regx,int flags){
Pattern p = Pattern.compile(regx,flags);
Matcher m = p.matcher(source);
boolean result = m.find();
通过user agent判断是否是手机
* 判断是否是手机(移动端)
* @param userAgent
public static boolean isMobile(String userAgent)
userAgent=userAgent.toLowerCase();
String []mobile_agents = {"240x320","acer","acoon","acs-","abacho","ahong","airness","alcatel","amoi","android","anywhereyougo.com","applewebkit/525","applewebkit/532","asus","audio","au-mic","avantogo","becker","benq","bilbo","bird","blackberry","blazer","bleu","cdm-","compal","coolpad","danger","dbtel","dopod","elaine","eric","etouch","fly ","fly_","fly-","go.web","goodaccess","gradiente","grundig","haier","hedy","hitachi","htc","huawei","hutchison","inno","ipad","ipaq","ipod","jbrowser","kddi","kgt","kwc","lenovo","lg ","lg2","lg3","lg4","lg5","lg7","lg8","lg9","lg-","lge-","lge9","longcos","maemo","mercator","meridian","micromax","midp","mini","mitsu","mmm","mmp","mobi","mot-","moto","nec-","netfront","newgen","nexian","nf-browser","nintendo","nitro","nokia","nook","novarra","obigo","palm","panasonic","pantech","philips","phone","pg-","playstation","pocket","pt-","qc-","qtek","rover","sagem","sama","samu","sanyo","samsung","sch-","scooter","sec-","sendo","sgh-","sharp","siemens","sie-","softbank","sony","spice","sprint","spv","symbian","tablet","talkabout","tcl-","teleca","telit","tianyu","tim-","toshiba","tsm","up.browser","utec","utstar","verykool","virgin","vk-","voda","voxtel","vx","wap","wellco","wig browser","wii","windows ce","wireless","xda","xde","zte"};
boolean is_mobile =
for (String device : mobile_agents) {
if(userAgent.contains(device)){
is_mobile=
return is_
public void test_userAgent()
String userAgent="Mozilla/5.0 (L U; Android 4.1.1; en- HTC T528d) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 MicroMessenger/6.0.2.58_r NetType/WIFI";
System.out.println(HeaderUtil.isMobile(userAgent));
userAgent="Opera/9.80 (Android 2.3.7; L Opera Mobi/46154) Presto/2.11.355 Version/12.10";
System.out.println(HeaderUtil.isMobile(userAgent));
源代码见附件,工具类:com.common.util.HeaderUtil
getMobileOsInfo在com.common.util.WebServletUtil
public static boolean isMicromessengerBrowser(HttpServletRequest request) {
String userAgent = request.getHeader("user-agent").toLowerCase();
return userAgent.contains("micromessenger");
作者:黄威 主页:
(280.1 KB)
下载次数: 75
浏览 11295
浏览: 3209853 次
来自: 北京
6ee55ec8ed9fff ...
6ee55ec8ed9fff ...
gmxy 写道a 写道指正一个错误:BigI ...
a 写道指正一个错误:BigInteger
写的十分详细我反复看了好几遍很难得把知识讲的如此详尽 表结构都 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'帝国cms判断访问者是否是通过手机访问的,如果是则进行跳转的设置方法 | 无忧主机
随着手机网络的发展,现在有越来越多的用户选择使用手机来访问网络,但是电脑端的网站和手机端的网站又常常难以兼顾,所以现在有很多的站长朋友为了应对这种情况,会在网站里面设置一个判断代码,如果判断用户是是通过手机访问的,那么会跳转页面。所以无忧主机小编也紧跟时代发展,下面就来介绍一下,如何在环境下实现的手机用户判断和跳转。
首先登入无忧账号的主机管理,找到自己的主机,点击控制面板,进入文件管理菜单
在路径/domains/自己网站的域名/public_html/e/class下找到userfun.php这个文件,点击编辑
添加下面的这一段代码,然后点击提交
function check_wap(){
// 先检查是否为wap代理,准确度高
if(stristr($_SERVER['HTTP_VIA'],&wap&)){
// 检查浏览器是否接受 WML.
elseif(strpos(strtoupper($_SERVER['HTTP_ACCEPT']),&VND.WAP.WML&) & 0){
//检查USER_AGENT
elseif(preg_match('/(blackberry|configuration\/cldc|hp|hp-|htc|htc_|htc-|iemobile|kindle|midp|mmp|motorola|mobile|nokia|operamini|opera|Googlebot-Mobile|YahooSeeker\/M1A1-R2D2|android|iphone|ipod|mobi|palm|palmos|pocket|portalmmm||smartphone|sonyericsson|sqh|spv|symbian|treo|up.browser|up.link|vodafone|windows ce|xda |xda_)/i', $_SERVER
['HTTP_USER_AGENT'])){
最后找到需要判断跳转的页面,用同样的方法在里面添加如下代码就可以了
$agent = check_wap();
if( $agent )
header('Location: http://需要设置的网站地址');
温馨提示:该技术解决方案的是由无忧主机客服为我们空间客户处理该问题时提供的处理方法,确保在无忧主机能完美实现,因服务较多,客服繁忙,其他主机我们没有过多精力进行大范围测试,不能确保所有虚拟主机都能完美处理,请您理解!
无忧主机提供365天*24小时全年全天无休、实时在线、零等待的售后技术支持。竭力为您免费处理您在使用无忧主机过程中所遇到的一切问题!
如果您是无忧主机用户,那么您可以通过企业QQ【】、售后QQ【网站最下端有】、旺旺【锋讯企业】、400-655-0080免费电话、后台提交工单这些方式联系无忧主机客服!
如果您不是我们的客户也没问题,点击页面最右边的企业QQ在线咨询图标联系我们并购买后,我们为您免费进行无缝搬家服务,让您享受网站零访问延迟的迁移到无忧主机的服务!
无忧主机相关文章推荐阅读:
本文地址:http://www.51php.com/empirecms/22179.html
喜欢本文或觉得本文对您有帮助,请分享给您的朋友 ^_^
无忧主机资质:(十四年旗舰品牌)
相关技术帮助文档
技术帮助文档分类}

我要回帖

更多关于 nginx ua判断访问终端 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信