User-Agent 字串歷經數十年演變,格式混亂、偽裝普遍、新裝置層出不窮。手寫正則極難維護且準確率低。現代專案強烈建議使用專用庫。
| 方案 | 語言 | 準確率 | 維護性 | 效能 | 推薦度 |
|---|---|---|---|---|---|
| UAParser (PHP) | PHP | ★★★★★ | ★★★★★ (YAML 規則自動更新) | ~0.5ms | ✅ 首選 |
| WhichBrowser | PHP | ★★★★☆ | ★★★★☆ | ~1ms | ✅ 備選 |
| get_browser() | PHP 內建 | ★★☆☆☆ | ★☆☆☆☆ (browscap.ini 手動更新) | ~2ms | ❌ 不推薦 |
| 手寫正則 | PHP | ★☆☆☆☆ | ★☆☆☆☆ | ~0.1ms | ❌ 禁用 |
| DeviceDetector | PHP | ★★★★★ | ★★★★★ | ~1.5ms | ✅ 功能最全 |
# Composer
composer require ua-parser/uaparser
# 程式碼
use UAParser\Parser;
$parser = Parser::create(); // 內建 regexes.yaml (自動更新可用 composer script)
$ua = 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Mobile/15E148 Safari/604.1';
$result = $parser->parse($ua);
echo "瀏覽器: {$result->ua->family} {$result->ua->major}.{$result->ua->minor}\n";
echo "作業系統: {$result->os->family} {$result->os->major}.{$result->os->minor}\n";
echo "裝置: {$result->device->family} ({$result->device->brand})\n";
echo "是否行動裝置: " . ($result->device->isMobile() ? '是' : '否') . "\n";
/*
瀏覽器: Mobile Safari 17.2
作業系統: iOS 17.2
裝置: iPhone (Apple)
是否行動裝置: 是
*/
composer require piwik/device-detector
use DeviceDetector\DeviceDetector;
use DeviceDetector\Cache\DoctrineCache;
use Doctrine\Common\Cache\ArrayCache;
$dd = new DeviceDetector($ua);
$dd->setCache(new DoctrineCache(new ArrayCache())); // 快取解析結果
$dd->parse();
if ($dd->isBot()) {
echo "Bot: {$dd->getBotName()} ({$dd->getBotUrl()})";
} else {
echo "Client: {$dd->getClient()->getName()} {$dd->getClient()->getVersion()}";
echo "OS: {$dd->getOs()->getName()} {$dd->getOs()->getVersion()}";
echo "Device: {$dd->getDeviceName()} ({$dd->getBrand()})";
echo "Is Mobile: " . ($dd->isMobile() ? 'yes' : 'no');
}
Chrome 89+ 支援 Sec-CH-UA-* 標頭,提供結構化、隱私保護的裝置資訊:
// PHP 取得 Client Hints
$secChUa = $_SERVER['HTTP_SEC_CH_UA'] ?? ''; // "Not A(Brand";v="99", "Google Chrome";v="120"
$secChUaMobile = $_SERVER['HTTP_SEC_CH_UA_MOBILE'] ?? ''; // ?0 or ?1
$secChUaPlatform = $_SERVER['HTTP_SEC_CH_UA_PLATFORM'] ?? ''; // "Windows"
// 解析建議仍用 UAParser (支援 Client Hints 格式)
// Redis 快取 UA 解析結果 (TTL 30 天)
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$cacheKey = 'ua:' . md5($ua);
$cached = $redis->get($cacheKey);
if ($cached) return json_decode($cached, true);
$result = $parser->parse($ua)->toArray(); // UAParser 結果轉陣列
$redis->setex($cacheKey, 2592000, json_encode($result));
return $result;
| 用途 | 所需欄位 | 範例 |
|---|---|---|
| 相容性提示 | browser.family, browser.major, os.family | IE 11 → 顯示升級提示 |
| 行動版導向 | device.isMobile(), device.family | iPhone/Android → 導向 m.example.com |
| 分析報表 | browser.family, os.family, device.brand | 統計 Chrome/Windows/iPhone 佔比 |
| 機器人識別 | DeviceDetector::isBot() | Googlebot → 允許爬取、不計入廣告曝光 |
| 安全風控 | UA 異常 (空、已知攻擊工具)、Client Hints 不一致 | 封鎖可疑請求 |
完整整合範例 (Laravel Service Provider、Middleware、Console 更新規則) 見 GitHub。