最直接的方法是用$_SERVER['HTTP_USER_AGENT']解析UA字符串:先安全获取并校验非空,排除iPad/Tablet,再用stripos匹配Mobile、Android、iPhone等关键词,避免大小写问题和误判平板。

用 $_SERVER['HTTP_USER_AGENT'] 做基础判断最直接
PHP 没有内置的“是手机吗”函数,最常用、最轻量的方式就是解析 $_SERVER['HTTP_USER_AGENT'] 字符串。它由浏览器主动发送,包含了设备类型、系统、浏览器等线索。
注意:这个值可以被伪造,不能用于安全校验,但做页面跳转、模板切换、样式加载等前端适配完全够用。
- 移动端 UA 通常含
Mobile、Android、iOS、iPad、iPhone、Windows Phone等关键词 -
Tablet和iPad要单独处理,避免把平板误判为手机 - 别只查
Android—— 很多 Android 平板 UA 里没有Mobile,但有Tablet - 推荐用
stripos()而非strpos(),避免大小写问题
一个稳妥的 is_mobile() 函数怎么写
下面这个函数在多数 CMS(如 WordPress 的早期版本)和项目中验证过,覆盖主流 UA 特征,不依赖外部库:
function is_mobile() {
$ua = $_SERVER['HTTP_USER_AGENT'] ?? '';
if (empty($ua)) return false;
// 明确排除平板(优先级高于 Mobile)
if (stripos($ua, 'Tablet') !== false || stripos($ua, 'iPad') !== false) {
return false;
}
// 常见移动设备关键词
$mobile_keywords = [
'Mobile', 'Android', 'iPhone', 'iPod', 'BlackBerry', 'Opera Mini',
'IEMobile', 'Windows Phone', 'Nokia', 'Samsung', 'HTC', 'LG', 'Sony'
];
foreach ($mobile_keywords as $keyword) {
if (stripos($ua, $keyword) !== false) {
return true;
}
}
return false;
}
调用时直接 if (is_mobile()) { ... } 即可。它不追求 100% 覆盖所有冷门设备,但能稳定区分 PC 与主流手机,且无额外依赖。
立即学习“PHP免费学习笔记(深入)”;
为什么别急着用 Mobile_Detect 这类第三方库
Mobile_Detect 功能强、更新勤,但对简单需求反而容易踩坑:
- 它的
isMobile()默认把iPad判为true,和多数业务逻辑冲突(比如你只想给手机发短信链接) - 新版默认启用
setDetectionType()后行为变化大,不读文档容易误判 - 仅需设备类型判断时,引入整个类库增加 autoload 开销,也提高部署复杂度
- 某些 CDN 或服务器禁用
get_headers()或远程请求,而部分检测逻辑会触发它(尤其开启扩展检测时)
真要上 Mobile_Detect,至少加一句 $detect->setDetectionType('mobile') 并手动排除 iPad。
HTTP_USER_AGENT 在 CLI 或 API 场景下为空怎么办
命令行运行 PHP(如定时任务)、或某些 API 请求(如 Postman、curl 不带 UA)时,$_SERVER['HTTP_USER_AGENT'] 根本不存在,直接取会报 Notice。
- 务必先用
isset()或空合并操作符?? ''安全读取 - API 接口建议由客户端显式传字段(如
device_type=mobile),比猜 UA 更可靠 - 如果必须服务端判断,可结合
$_SERVER['REMOTE_ADDR']查 IP 归属(不推荐:慢、不准、隐私风险) - 微信内嵌浏览器等特殊环境,UA 可能不带
Mobile但含MicroMessenger,需要额外加关键词
UA 判断本质是概率游戏,越想“绝对准确”,越容易掉进特征维护和兼容性泥潭。实际项目里,明确你的使用边界(比如只要区分手机/PC、不care手表和车载屏),再选最简方案。



















