我正在用PHP编写一个网站。由于网络上的任何人都需要访问它才能访问互联网,因此我必须创建一个移动版本。如何最好地检查它是否是移动设备?我不想在最后有50个设备的switch语句,因为我不仅要支持iPhone。
我可以使用PHP类吗?
答案 0 :(得分:15)
您需要检查客户端发送的多个标头,例如USER_AGENT和HTTP_ACCEPT。查看this article以获取PHP中移动用户代理的全面检测脚本。
答案 1 :(得分:5)
你应该看看Tera-WURFL,这是一个PHP&基于MySQL的软件包,可检测移动设备及其功能。以下是您将用于检测访问设备是否可移动的Tera-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
}
?>
答案 2 :(得分:4)
需要考虑的另一件事:许多网站实际上会为移动设备提供不同的网址。请参阅http://m.facebook.com作为示例。随着设备日益增长的能力,这为您的用户提供了一个选择。如果他们使用的设备可以很好地处理一个完整的网站(使用缩放和诸如此类的东西),那么他们可能会非常恼火地被迫进入特定的布局。
答案 3 :(得分:3)
对于重定向部分,我使用了
$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();
}
有关我的详细信息,请阅读我的博客http://haibuihoang.blogspot.com/2012/11/how-to-redirect-mobile-users-to-your.html
答案 4 :(得分:2)
传统上通过将HTTP User-Agent标头与众所周知的移动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()
答案 5 :(得分:1)
请求中的用户代理是否会为您提供足够的信息来做出决定?
有一个很好的list of user agents here。
答案 6 :(得分:0)
对于基于User-Agent的检测,请使用WURFL database。至少它是全面且不断更新的。
如果您只定位高端(ish)手机,那么您可能根本不需要检测它们,只需embed appropriate mobile stylesheets。
答案 7 :(得分:0)
如果您想让内容适应任何特定设备,例如要将图像大小调整为设备的宽度,您还可以使用DeviceAtlas。 根据请求设备的使用者,它将告诉您屏幕的大小,支持的图像格式,支持的标记类型,最大页面大小等。
答案 8 :(得分:0)
大多数移动网站都使用user_agent。设备功能的开源数据库维护在http://wurfl.sourceforge.net/ 使用wurlf,并基于user_agent,您可以识别屏幕物理和像素宽度,长度以及更多参数,并做出渲染决策。
答案 9 :(得分:0)
什么是移动设备? CPU较弱?带宽较低?实际上,它的分辨率低于320x240,色深低于24。
你也必须使用Javascript。这个链接会给你一个想法: http://www.w3schools.com/js/tryit.asp?filename=tryjs_browsermonitor
而且,此链接将教你什么是: http://www.w3schools.com/htmldom/dom_obj_screen.asp
答案 10 :(得分:0)
通过检查用户代理来决定移动设备不是最好的选择。您应该使用PHP用户代理检查加入javascript设备宽度检查。但是在某些时候用户代理检查是可以接受的。
我用这个。不如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;
}