通過分析 $_SERVER['HTTP_USER_AGENT'] 及相關 Header,識別移動設備特徵字符串。無單一標準能 100% 準確,需結合多種特徵綜合判斷。
<?php
function isMobile(): bool {
// 1. 代理/網關特徵(WAP 時代遺留,現較少見)
if (isset($_SERVER['HTTP_VIA']) ||
isset($_SERVER['HTTP_X_NOKIA_CONNECTION_MODE']) ||
isset($_SERVER['HTTP_X_UP_CALLING_LINE_ID'])) {
return true;
}
// 2. Accept 頭包含 WML
if (stripos($_SERVER['HTTP_ACCEPT'] ?? '', 'vnd.wap.wml') !== false) {
return true;
}
$ua = $_SERVER['HTTP_USER_AGENT'] ?? '';
if (empty($ua)) return true; // 無 UA 視為移動端(保守策略)
// 3. 作業系統/平台關鍵字
$mobileOS = [
'Android', 'iPhone', 'iPod', 'iPad', 'Windows Phone',
'BlackBerry', 'Symbian', 'webOS', 'Kindle', 'Silk',
'Mobile', 'Tablet', 'Opera Mini', 'Opera Mobi',
'UCBrowser', 'MQQBrowser', 'MicroMessenger' // 微信內置瀏覽器
];
// 4. 具體設備/瀏覽器 Token
$mobileTokens = [
'Mobile', 'Android', 'iPhone', 'iPad', 'iPod',
'BlackBerry', 'Windows Phone', 'Opera Mini',
'Opera Mobi', 'IEMobile', 'UCWEB', 'UCBrowser',
'MQQBrowser', 'MicroMessenger', 'WeChat',
'MIUI', 'Huawei', 'Xiaomi', 'OPPO', 'Vivo',
'SamsungBrowser', 'Chrome.*Mobile', 'Firefox.*Mobile'
];
foreach ($mobileOS as $os) {
if (stripos($ua, $os) !== false) return true;
}
foreach ($mobileTokens as $token) {
if (stripos($ua, $token) !== false) return true;
}
return false;
}
// 使用示例
if (isMobile()) {
header('Location: https://m.example.com'); // 跳轉移動端站點
exit;
}
// 繼續 PC 站點邏輯
?>
HTTP_VIA 等。stripos() 大小寫不敏感匹配,覆蓋主流移動 OS、瀏覽器、App 內嵌 WebView。MicroMessenger,需單獨識別以適配 JSSDK。Mobile 或 Tablet,按業務決定歸類。Mobile_Detectcomposer require mobiledetect/mobiledetectlib
$detect = new Detection\MobileDetect();
if ($detect->isMobile()) { /* ... */ }
if ($detect->isTablet()) { /* ... */ }
if ($detect->isiOS()) { /* ... */ }
該庫維護龐大的特徵庫,準確率遠高於手寫正則。
若僅為調整佈局,優先採用 CSS 響應式,避免服務端渲染不同模板帶來的緩存複雜度。
現代瀏覽器支援 Sec-CH-UA-Mobile、Sec-CH-UA-Platform 等 Header,可作為補充判斷依據。
手寫 UA 解析適合簡單項目或無 Composer 環境;生產環境強烈建議接入 Mobile_Detect 並定期更新。同時配合響應式前端,實現「一套代碼,多端適配」。