封裝常見手機端 HTTP 頭檢測,提供:手機號碼提取(網關透傳)、User-Agent 解析、手機類型識別、Opera/M3Gate 瀏覽器判斷、HTTP Accept 獲取、真實 IP 獲取(支持代理穿透)。
<?php
/**
* 手機信息檢測類
* 適用於 WAP 2.0 / 早期智能機時代網關透傳頭
* 現代 4G/5G 環境多不再透傳手機號,僅供歷史項目維護參考
*/
class MobileInfo {
/**
* 獲取手機號碼
* 依賴運營商網關透傳頭,現代網絡基本不可用
* @return string|false
*/
public function getPhoneNumber() {
// 中國移動 CMNET/CMWAP
if (isset($_SERVER['HTTP_X_NETWORK_INFO'])) {
$str = $_SERVER['HTTP_X_NETWORK_INFO'];
// 格式示例: "...,11012345678,..."
return preg_replace('/(.*,)(11\d)(,.*)/i', '$2', $str);
}
// 中國聯通/電信舊網關
if (isset($_SERVER['HTTP_X_UP_CALLING_LINE_ID'])) {
return $_SERVER['HTTP_X_UP_CALLING_LINE_ID'];
}
if (isset($_SERVER['HTTP_X_UP_SUBNO'])) {
$str = $_SERVER['HTTP_X_UP_SUBNO'];
return preg_replace('/(.*)(11\d)(.*)/i', '$2', $str);
}
// 部分設備 ID
if (isset($_SERVER['DEVICEID'])) {
return $_SERVER['DEVICEID'];
}
return false;
}
/**
* 獲取所有 HTTP 頭(調試用)
* @return string
*/
public function getHttpHeader() {
$str = '';
foreach ($_SERVER as $key => $val) {
$val = str_replace('&', '&', $val); // 防 XSS
$str .= "$key → $val\n";
}
return $str;
}
/**
* 獲取 User-Agent
* @return string|false
*/
public function getUA() {
return $_SERVER['HTTP_USER_AGENT'] ?? false;
}
/**
* 解析手機類型(取 UA 首段)
* 典型 UA: "NokiaN73/3.0 (SymbianOS/9.2; U; en-us) ..."
* @return string|false
*/
public function getPhoneType() {
$ua = $this->getUA();
if ($ua !== false) {
// 以空格、分號、括號為分隔,取首個標識
return preg_split('/[\s;()]/', $ua, 2)[0];
}
return false;
}
/**
* 判斷是否 Opera 瀏覽器
* @return bool
*/
public function isOpera() {
$ua = $this->getUA();
return $ua && preg_match('/Opera/i', $ua);
}
/**
* 判斷是否 M3Gate 瀏覽器(山寨機常見)
* @return bool
*/
public function isM3gate() {
$ua = $this->getUA();
return $ua && preg_match('/M3Gate/i', $ua);
}
/**
* 獲取 HTTP Accept 頭
* @return string|false
*/
public function getHttpAccept() {
return $_SERVER['HTTP_ACCEPT'] ?? false;
}
/**
* 獲取客戶端真實 IP(穿透代理)
* @return string
*/
public function getIP() {
$ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
$forwarded = $_SERVER['HTTP_X_FORWARDED_FOR'] ?? '';
if ($forwarded && $forwarded !== 'unknown') {
// 取第一個非未知 IP
$ips = explode(',', $forwarded);
foreach ($ips as $fip) {
$fip = trim($fip);
if ($fip && $fip !== 'unknown') {
$ip = $fip;
break;
}
}
}
return $ip;
}
}
// 使用示例
$mobile = new MobileInfo();
echo "手機號: " . ($mobile->getPhoneNumber() ?: '不可用') . "<br>";
echo "UA: " . ($mobile->getUA() ?: '無') . "<br>";
echo "類型: " . ($mobile->getPhoneType() ?: '未知') . "<br>";
echo "IP: " . $mobile->getIP() . "<br>";
echo "Opera: " . ($mobile->isOpera() ? '是' : '否') . "<br>";
echo "M3Gate: " . ($mobile->isM3gate() ? '是' : '否') . "<br>";
?>
HTTP_X_NETWORK_INFO 等)幾乎完全不可用,運營商出於隱私合規不再透傳DEVICEID)僅極少數定制 ROM/物聯網卡保留static $regex = []; $regex['phone'] ??= '/pattern/';filter_var($ip, FILTER_VALIDATE_IP))getClientInfo() 聚合方法,一次性返回結構化數組供 API 輸出ServerRequestInterface 解耦全局 $_SERVER,便於測試本類作為歷史代碼參考價值大,展示了早期移動互聯網網關協議特徵。新項目請採用運營商一鍵登錄 + 設備指紋 + 專業 UA 解析庫組合方案。