響應式設計雖能適配螢幕,但仍會載入桌機端資源浪費行動裝置頻寬。伺服器端透過 PHP 判斷裝置類型,可直接輸出輕量化模板,顯著提升行動端體驗。本文提供涵蓋 HTTP 標頭、User-Agent 關鍵字、協議接受度的多層次偵測函式。
<?php
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'])) {
$clientKeywords = [
'nokia', 'sony', 'ericsson', 'mot', 'samsung', 'htc', 'sgh', 'lg', 'sharp',
'sie-', 'philips', 'panasonic', 'alcatel', 'lenovo', 'iphone', 'ipod',
'blackberry', 'meizu', 'android', 'netfront', 'symbian', 'ucweb',
'windowsce', 'palm', 'operamini', 'operamobi', 'openwave', 'nexusone',
'cldc', 'midp', 'wap', 'mobile'
];
$pattern = '/' . implode('|', $clientKeywords) . '/i';
if (preg_match($pattern, $_SERVER['HTTP_USER_AGENT'])) {
return true;
}
}
// 4. Accept 協議判斷(兜底邏輯,準確度較低)
if (isset($_SERVER['HTTP_ACCEPT'])) {
$accept = $_SERVER['HTTP_ACCEPT'];
$wmlPos = stripos($accept, 'vnd.wap.wml');
$htmlPos = stripos($accept, 'text/html');
// 僅支援 WML,或 WML 優先於 HTML
if ($wmlPos !== false && ($htmlPos === false || $wmlPos < $htmlPos)) {
return true;
}
}
return false;
}
?>
| 層級 | 依據 | 可信度 | 誤判風險 |
|---|---|---|---|
| 1 | HTTP_X_WAP_PROFILE | ★★★★★ | 極低(標準 WAP 協議) |
| 2 | HTTP_VIA 包含 wap | ★★★★☆ | 低(部分代理移除) |
| 3 | User-Agent 關鍵字 | ★★★☆☆ | 中(需持續維護關鍵字庫) |
| 4 | HTTP_ACCEPT 協議順序 | ★★☆☆☆ | 高(現代手機瀏覽器皆支援 HTML) |
<?php
if (isMobile()) {
include 'templates/mobile/header.php';
// 輸出精簡版資料、縮圖、無動畫版面
} else {
include 'templates/desktop/header.php';
// 輸出完整版資源、高解析度圖片、互動特效
}
?>
透過多層次判斷邏輯與持續維護的特徵庫,PHP 端偵測能有效減少行動端不必要資源載入,是響應式設計的最佳補完。