我正在用PHP編寫一個網站。由於網絡上的任何人都需要訪問以訪問互聯網,我必須創建一個移動版本。如何最好地檢查它是否是移動設備?由於我不僅想支持iPhone,所以我不想在最後使用50個設備進行切換聲明。如何確定它是否是使用PHP的移動設備?
有沒有我可以使用的PHP類?
我正在用PHP編寫一個網站。由於網絡上的任何人都需要訪問以訪問互聯網,我必須創建一個移動版本。如何最好地檢查它是否是移動設備?由於我不僅想支持iPhone,所以我不想在最後使用50個設備進行切換聲明。如何確定它是否是使用PHP的移動設備?
有沒有我可以使用的PHP類?
您需要檢查客戶端發送的幾個標頭,例如USER_AGENT和HTTP_ACCEPT。查看this article,獲取PHP中移動用戶代理的全面檢測腳本。
請求中的用戶代理會給你足夠的信息來作出決定嗎?
有一個很好的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;
}
如果他們正在使用他們自己的檢測,那麼它已經壞了。它告訴我,我在Mac OS X上的Opera 10是一款手機瀏覽器。 – Kornel 2008-12-22 12:16:48
我沒有調試他們的腳本,如果這就是你問的:) 當然,你應該總是測試你在互聯網上閱讀的所有內容,但原理是 – 2008-12-22 12:41:23
這篇文章是四歲,錯過了很多較新的設備。 – bestattendance 2011-10-16 21:43:22