首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 判斷客戶端類型:手機還是電腦訪問

     編輯:PHP 相關知識

核心思路

通過分析 $_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 站點邏輯
?>

關鍵點解析

  • 優先檢查特定 Header:部分運營商代理、舊款諾基亞設備會發送 HTTP_VIA 等。
  • User-Agent 關鍵字匹配:採用 stripos() 大小寫不敏感匹配,覆蓋主流移動 OS、瀏覽器、App 內嵌 WebView。
  • 微信/小程序環境:UA 包含 MicroMessenger,需單獨識別以適配 JSSDK。
  • 平板設備:iPad、Android 平板 UA 多包含 Mobile 或 Tablet,按業務決定歸類。

現代替代方案

1. 使用成熟庫 Mobile_Detect

composer require mobiledetect/mobiledetectlib

$detect = new Detection\MobileDetect();
if ($detect->isMobile()) { /* ... */ }
if ($detect->isTablet()) { /* ... */ }
if ($detect->isiOS()) { /* ... */ }

該庫維護龐大的特徵庫,準確率遠高於手寫正則。

2. 響應式設計(CSS Media Queries)

若僅為調整佈局,優先採用 CSS 響應式,避免服務端渲染不同模板帶來的緩存複雜度。

3. Client Hints(新標準)

現代瀏覽器支援 Sec-CH-UA-Mobile、Sec-CH-UA-Platform 等 Header,可作為補充判斷依據。

總結

手寫 UA 解析適合簡單項目或無 Composer 環境;生產環境強烈建議接入 Mobile_Detect 並定期更新。同時配合響應式前端,實現「一套代碼,多端適配」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved