隨著行動流量超越桌面,精準識別行動裝置成為響應式設計、行動版導向、廣告投放等場景的基礎需求。本文提供一個生產級的 isMobile() 函式,涵蓋 HTTP 標頭、User-Agent 關鍵字、Accept 協議三層檢測邏輯,並說明優化方向。
/**
* 判斷是否為行動裝置存取
* @return bool
*/
function isMobile(): bool
{
// 1. WAP Profile 標頭(最高優先級)
if (isset($_SERVER['HTTP_X_WAP_PROFILE'])) {
return true;
}
// 2. Via 標頭包含 wap
if (isset($_SERVER['HTTP_VIA']) && stripos($_SERVER['HTTP_VIA'], 'wap') !== false) {
return true;
}
// 3. User-Agent 關鍵字匹配
if (isset($_SERVER['HTTP_USER_AGENT'])) {
$ua = strtolower($_SERVER['HTTP_USER_AGENT']);
$keywords = [
// 品牌
'nokia', 'sony', 'ericsson', 'mot', 'samsung', 'htc', 'sgh', 'lg', 'sharp',
'sie-', 'philips', 'panasonic', 'alcatel', 'lenovo', 'iphone', 'ipod',
'blackberry', 'meizu', 'xiaomi', 'huawei', 'oppo', 'vivo', 'oneplus',
// 作業系統/平台
'android', 'ios', 'ipados', 'windows phone', 'windows ce', 'palm', 'symbian',
'blackberry', 'webos', 'bada', 'tizen', 'kaios',
// 瀏覽器/引擎
'netfront', 'ucweb', 'ucbrowser', 'mobile safari', 'mobile chrome',
'firefox mobile', 'opera mini', 'opera mobi', 'openwave', 'nexus',
// 技術標識
'cldc', 'midp', 'wap', 'mobile', 'micro messenger', 'micromessenger'
];
$pattern = '/(' . implode('|', array_map('preg_quote', $keywords)) . ')/i';
if (preg_match($pattern, $ua)) {
return true;
}
}
// 4. Accept 協議分析
if (isset($_SERVER['HTTP_ACCEPT'])) {
$accept = strtolower($_SERVER['HTTP_ACCEPT']);
$wmlPos = strpos($accept, 'vnd.wap.wml');
$htmlPos = strpos($accept, 'text/html');
if ($wmlPos !== false && ($htmlPos === false || $wmlPos < $htmlPos)) {
return true;
}
}
return false;
}
if (isMobile()) {
// 重導向至行動版
header('Location: https://m.example.com');
exit;
}
// 或載入行動版模板
$template = isMobile() ? 'mobile/index.tpl' : 'desktop/index.tpl';
| 方向 | 說明 |
|---|---|
| 引入成熟函式庫 | Mobile_Detect:支援平板、機器人、特定裝置型號識別,定期更新 UA 資料庫 |
| 快取判斷結果 | 同一 Session 僅判斷一次,儲存於 $_SESSION['is_mobile'] |
| 結合響應式設計 | CSS Media Queries 為主,PHP 判斷為輔(如行動版專用 API、廣告位) |
| 處理偽裝 UA | 部分爬蟲/工具偽裝行動 UA,可結合 HTTP_X_REQUESTED_WITH、行為分析二次驗證 |
| 平板電腦區分 | 擴充關鍵字 ipad、tablet、kindle,返回三態:desktop / mobile / tablet |
static $pattern = null; if ($pattern === null) $pattern = ...建議:新專案優先採用 Mobile_Detect 等成熟套件,僅在無 Composer 環境、極簡專案中使用輕量自訂函式。核心邏輯保持「標頭優先、UA 次之、協議輔助」的分層策略。