如何确定它是否是使用PHP的移动设备?

问题描述:

我正在用PHP编写一个网站。由于网络上的任何人都需要访问以访问互联网,我必须创建一个移动版本。如何最好地检查它是否是移动设备?由于我不仅想支持iPhone,所以我不想在最后使用50个设备进行切换声明。如何确定它是否是使用PHP的移动设备?

有没有我可以使用的PHP类?

您需要检查客户端发送的几个标头,例如USER_AGENT和HTTP_ACCEPT。查看this article,获取PHP中移动用户代理的全面检测脚本。

+0

如果他们正在使用他们自己的检测,那么它已经坏了。它告诉我,我在Mac OS X上的Opera 10是一款手机浏览器。 – Kornel 2008-12-22 12:16:48

+0

我没有调试他们的脚本,如果这就是你问的:) 当然,你应该总是测试你在互联网上阅读的所有内容,但原理是 – 2008-12-22 12:41:23

+1

这篇文章是四岁,错过了很多较新的设备。 – bestattendance 2011-10-16 21:43:22

请求中的用户代理会给你足够的信息来作出决定吗?

有一个很好的list of user agents here

要基于User-Agent进行检测,请使用WURFL database。至少它是全面的,并不断更新。

如果您只定位高端(ish)手机,则根本不需要检测它们,只需要embed appropriate mobile stylesheets即可。

要考虑的另一件事:很多网站实际上会为移动设备提供不同的网址。以http://m.facebook.com为例。随着设备的日益增长的能力,这给了你的用户一个选择。如果他们使用的是可以实际处理完整网站的设备(使用缩放和其他功能),那么他们可能会被强制进入特定的布局。

如果您想让内容适应任何特定设备,例如要将图像大小调整为设备的宽度,则还可以使用DeviceAtlas。 根据请求设备的使用情况,它会告诉您屏幕的大小,以及支持的图像格式,支持的标记类型,最大页面大小等。

大多数移动网站都使用user_agent。设备功能的开源数据库维护在http://wurfl.sourceforge.net/ 使用wurlf,并基于user_agent,您可以识别屏幕物理和像素宽度,长度以及更多参数,并进行渲染决策。

什么是移动设备?较弱的CPU?带宽更低?实际上,它的屏幕分辨率低于320x240,色深低于24.

您必须使用Javascript。此链接会给你一个想法: http://www.w3schools.com/js/tryit.asp?filename=tryjs_browsermonitor

而且,这个环节将教你什么是什么:已通过HTTP User-Agent头反对以及列表进行比较检测 http://www.w3schools.com/htmldom/dom_obj_screen.asp

传统移动设备已知的移动UA字符串。一种新颖的方法试图检测桌面操作系统的存在 - 任何发现不是桌面操作系统的东西都必须是移动的。

这会导致误报少得多。

我已经写在Python示例代码在这里一个帖子: http://notnotmobile.appspot.com

这里是一个片段:

import re 

# Some mobile browsers which look like desktop browsers. 
RE_MOBILE = { 
    "iphone" : re.compile("ip(hone|od)", re.I), 
    "winmo" : re.compile("windows\s+ce", re.I)} 

RE_DESKTOP = { 
    "linux" : re.compile(r"linux", re.I), 
    "windows" : re.compile(r"windows", re.I), 
    "mac" : re.compile(r"os\s+(X|9)", re.I), 
    "solaris" : re.compile(r"solaris", re.I), 
    "bsd" : re.compile(r"bsd", re.I)} 

# Bots that don't contain desktop OSs. 
RE_BOT = re.compile(r"(spider|crawl|slurp|bot)") 


def is_desktop(user_agent): 
    # Anything that looks like a phone isn't a desktop. 
    for regex in RE_PHONE.values(): 
    if regex.search(user_agent) is not None: 
     return False 

    # Anything that looks like a desktop probably is. 
    for regex in RE_DESKTOP.values(): 
    if regex.search(user_agent) is not None: 
     return True 

    # Bots get the desktop view. 
    if RE_BOT.search(user_agent) is not None: 
    return True 

    # Anything else is probably a phone! 
    return False 

def get_user_agent(request): 
    # Some browsers put the User-Agent in a HTTP-X header 
    if 'HTTP_X_OPERAMINI_PHONE_UA' in request.headers: 
    return request.headers['HTTP_X_OPERAMINI_PHONE_UA'] 
    elif: 
    # Skyfire/Bolt/other mobile browsers 
    ... 
    else: 
    return request.headers.get('HTTP_USER_AGENT', '') 

def view(request): 
    user_agent = get_user_agent(request) 
    if is_desktop(user_agent): 
    return desktop_response() 
    else: 
    return mobile_response() 

你应该看看Tera-WURFL,它是一个PHP &基于MySQL的软件包可以检测移动设备及其功能。这里是你会用它来检测是否来访的设备是移动的万亿WURFL代码:

<?php 
require_once("TeraWurfl.php"); 
$wurflObj = new TeraWurfl(); 
$wurflObj->GetDeviceCapabilitiesFromAgent(); 
if($wurflObj->capabilities['product_info']['is_wireless_device']){ 
    // this is a mobile device 
}else{ 
    // this is a desktop device 
} 
?>  

对于重定向的部分,我用

$arr = explode('.', $_SERVER['SERVER_NAME'], 2); 
$sub=$arr[0]; 
$need_redirect=false; 
if (!isset($_SERVER['HTTP_REFERER'])){ 
    $need_redirect=true; 
}else{ 
    $domain = parse_url($_SERVER['HTTP_REFERER']); 
    $host = $domain['host']; 
    if (!preg_match('/romajidesu\.com/', $host)){ 
     $need_redirect=true;   
    }  
} 
if ($need_redirect && ($sub!='m') && is_mobile()){ 
    $old_url=$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; 
    $new_url='http://'.str_replace('www.', 'm.', $old_url); 
    header("Location:".$new_url);die(); 
} 

对于我implmentation的更多细节,请阅读我的博客为http://haibuihoang.blogspot.com/2012/11/how-to-redirect-mobile-users-to-your.html

这不是通过检查用户代理来决定移动设备的最佳选择。你应该加入javascript设备宽度检查和PHP用户代理检查。但是直到某点用户代理检查是可以接受的。

我用这个。不如WURFL,但很容易解决我的问题:

function is_mobile_device() { 

    $agent=$_SERVER['HTTP_USER_AGENT']; 

    if(strpos($agent,"Android") !== FALSE 
     || strpos($agent,"IOS") !== FALSE 
     || strpos($agent,"iPhone") !== FALSE 
     || strpos($agent,"iPad") !== FALSE 
     || strpos($agent,"iPod") !== FALSE 
     || strpos($agent,"Symbian") !== FALSE 
     || strpos($agent,"BlackBerry") !== FALSE 
     || strpos($agent,"Opera Mini") !== FALSE 
    ) { 
     return TRUE; 
    } 
    return FALSE; 

}