Nginx可通过if或map指令结合$http_user_agent识别移动端UA并302跳转,推荐map预处理提升性能与可维护性,需防跳转闭环且UA检测存在伪造和误判风险,响应式设计应为首选。
可以通过 Nginx 的
指令结合
变量,识别常见移动端 UA 字符串,再用
或
实现跳转。但需注意:
if 在 location 块中使用有局限性,且过度依赖 UA 判断并不完全可靠
,建议仅用于简单场景或作为辅助策略。
识别主流移动设备 UA 关键词
Nginx 本身不支持正则“或”逻辑直接匹配多个关键词,但可用嵌套
或利用
指令预处理(更推荐)。若坚持用
,可这样写:
说明:
表示忽略大小写的正则匹配
括号内是常见移动端 UA 中出现的关键词,覆盖 iOS、安卓、旧式 Windows Phone 和黑莓等
跳转用
更安全(临时跳转),上线稳定后可改为
避免 if 嵌套陷阱:优先用 map + if 组合
直接在 server 或 location 中多次写
易出错(如重复执行、变量覆盖)。更清晰的做法是先用
提取判断结果:
优点:
在配置加载时预计算,性能更好
逻辑分离,便于维护和扩展(比如后续加微信内置浏览器识别)
避免在 location 内误用
导致 rewrite 循环或变量失效
补充:跳转前检查是否已在移动端域名
防止用户从 m 站再刷新,被反复跳转(即跳转闭环)。可在跳转逻辑前加一层判断:
或者更简洁地用
合并判断:
注意事项与替代建议
单纯靠 UA 跳转存在几个现实问题:
UA 可被客户端随意伪造,无法保证 100% 准确
部分安卓平板 UA 含 “Mobile”,但实际需要桌面版体验
微信、QQ、抖音等内置浏览器 UA 特征复杂,需单独识别(如含 “MicroMessenger”)
现代响应式设计 + viewport + 媒体查询已能覆盖多数场景,服务端跳转非必需
如需更高可靠性,建议:
前端通过 JS 检测屏幕宽度或 touch 支持,再决定加载 m 站资源;Nginx 仅作兜底或 SEO 友好跳转
。
if$http_user_agentreturnrewriteifmapifif ($http_user_agent ~* "(iPhone|iPad|iPod|Android|Mobile|BlackBerry|Opera Mini|IEMobile)") {
return 302 https://www.php.cn/link/c1ca185ea0fad2ac9c1e9bf8e21c793e;
}~*302301ifmapmap $http_user_agent $is_mobile {
default 0;
"~*iPhone" 1;
"~*Android.*Mobile" 1;
"~*Windows Phone" 1;
"~*BlackBerry" 1;
}
server {
...
if ($is_mobile = 1) {
return 302 https://www.php.cn/link/c1ca185ea0fad2ac9c1e9bf8e21c793e;
}
}
mapifif ($is_mobile = 1) {
if ($host != "m.example.com") {
return 302 https://www.php.cn/link/c1ca185ea0fad2ac9c1e9bf8e21c793e;
}
}mapmap $http_user_agent $need_mobile_redirect {
default 0;
"~*iPhone|Android.*Mobile" "$host != 'm.example.com'";
}
if ($need_mobile_redirect) {
return 302 https://www.php.cn/link/c1ca185ea0fad2ac9c1e9bf8e21c793e;
}
