早期 WAP 開發時代,伺服器需識別手機型號、瀏覽器特性、甚至手機號碼以提供差異化服務。本文封裝一個 mobile 類,整合常見手機信息獲取方法,供歷史項目維護或特殊場景參考。
<?php
class mobile {
/** 獲取手機號碼(依賴運營商網關 Header) */
public function getPhoneNumber() {
if (isset($_SERVER['HTTP_X_NETWORK_INFO'])) {
$str = $_SERVER['HTTP_X_NETWORK_INFO'];
return preg_replace('/(.*,)(11\d)(,.*)/i', '$2', $str);
} elseif (isset($_SERVER['HTTP_X_UP_CALLING_LINE_ID'])) {
return $_SERVER['HTTP_X_UP_CALLING_LINE_ID'];
} elseif (isset($_SERVER['HTTP_X_UP_SUBNO'])) {
$str = $_SERVER['HTTP_X_UP_SUBNO'];
return preg_replace('/(.*)(11\d)(.*)/i', '$2', $str);
} elseif (isset($_SERVER['DEVICEID'])) {
return $_SERVER['DEVICEID'];
}
return false;
}
/** 獲取完整 HTTP Header 信息 */
public function getHttpHeader() {
$str = '';
foreach ($_SERVER as $key => $val) {
$val = str_replace('&', '&', $val);
$str .= "$key -> $val\r\n";
}
return $str;
}
/** 獲取 User-Agent */
public function getUA() {
return isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : false;
}
/** 解析手機類型(取 UA 首段) */
public function getPhoneType() {
$ua = $this->getUA();
return $ua ? explode(' ', $ua)[0] : false;
}
/** 判斷是否 Opera 瀏覽器 */
public function isOpera() {
$ua = $this->getUA();
return $ua && preg_match('/.*Opera.*/i', $ua);
}
/** 判斷是否 M3Gate 瀏覽器 */
public function isM3gate() {
$ua = $this->getUA();
return $ua && preg_match('/M3Gate/i', $ua);
}
/** 獲取 HTTP Accept Header */
public function getHttpAccept() {
return isset($_SERVER['HTTP_ACCEPT']) ? $_SERVER['HTTP_ACCEPT'] : false;
}
/** 獲取客戶端 IP(支援代理穿透) */
public function getIP() {
$ip = getenv('REMOTE_ADDR');
$forwarded = getenv('HTTP_X_FORWARDED_FOR');
if ($forwarded && $forwarded !== 'unknown') {
$ip = $forwarded;
}
return $ip;
}
}
?>
HTTP_X_NETWORK_INFO),現代 4G/5G 環境下極少見,僅供歷史參考。getPhoneType() 簡單取首段,實際項目建議引入專業 UA 解析庫(如 ua-parser)。X-Forwarded-For,但需注意 Header 可偽造,安全敏感場景需結合信任代理名單。目前響應式設計與前端適配為主流,伺服器端設備識別多用於統計分析、風控策略。推薦使用 Mobile_Detect、DeviceDetector 等成熟庫,支援更豐富的設備屬性與準確度。