根據 `User-Agent` 標頭識別客戶端類型,動態切換項目模組 (如 `Home` PC 端、`Mobile` 行動端),實現同域名下不同模板輸出。
<?php
function is_mobile(): bool {
$ua = $_SERVER['HTTP_USER_AGENT'] ?? '';
if (!$ua) return false;
// 常見行動裝置關鍵字 (持續更新)
$mobileKeywords = [
'android', 'iphone', 'ipad', 'ipod', 'blackberry', 'windows phone',
'opera mini', 'opera mobi', 'mobile', 'tablet', 'kindle', 'silk',
'xiaomi', 'huawei', 'oppo', 'vivo', 'meizu', 'oneplus', 'google pixel',
'fennec', 'crios', 'fxios', 'ucbrowser', 'miui', 'flyme',
];
$uaLower = strtolower($ua);
foreach ($mobileKeywords as $kw) {
if (strpos($uaLower, $kw) !== false) {
return true;
}
}
return false;
}
?>
<?php
define('THINK_PATH', __DIR__ . '/thinkphp/');
define('APP_DEBUG', true);
// 載入判斷函數 (或放入 common.php)
require __DIR__ . '/common.php';
if (is_mobile()) {
// 行動裝置 → Mobile 模組
define('BIND_MODULE', 'Mobile');
define('APP_PATH', __DIR__ . '/application/mobile/');
} else {
// PC 端 → Home 模組
define('BIND_MODULE', 'Home');
define('APP_PATH', __DIR__ . '/application/home/');
}
// ThinkPHP 3.2+ 支援 BIND_MODULE 常數直接綁定模組
require THINK_PATH . 'ThinkPHP.php';
?>
<?php
// public/index.php
require __DIR__ . '/vendor/autoload.php';
$app = require __DIR__ . '/config/app.php'; // 應用配置
// 動態修改默認模組
if (is_mobile()) {
$app['default_module'] = 'mobile';
// 可選:載入行動端專屬配置
$mobileConfig = __DIR__ . '/config/mobile.php';
if (is_file($mobileConfig)) {
$app = array_merge($app, require $mobileConfig);
}
}
$http = (new \think\App($app))->http;
$response = $http->run();
$response->send();
$http->end($response);
?>
手寫關鍵字列表難以維護,建議引入 **Mobile_Detect** (PHP 經典庫) 或 **WhichBrowser** (更詳細):
composer require mobiledetect/mobiledetectlib
<?php
use Detection\MobileDetect;
function is_mobile(): bool {
$detect = new MobileDetect();
return $detect->isMobile() || $detect->isTablet();
}
?>
| 策略 | 優點 | 缺點 |
|---|---|---|
| 獨立模板 (本文方案) | 極致客製化、精簡行動端資源、舊專案相容 | 維護兩套視圖、內容同步成本高 |
| 響應式 (RWD) + 同一模板 | 單一代碼庫、CSS/JS 邏輯復用、SEO 友善 | 複雜互動難適配、行動端可能載入多餘資源 |
| 適應性設計 (Adaptive) / SSR 分流 | 伺服器端輸出差異化 HTML、效能最佳 | 架構複雜、快取策略棘手 |
靈活運用 User-Agent 判斷與模組綁定,可在不改變 URL 架構下快速支援行動端專屬體驗。