最直接获取 user-agent 的方式是 ctx.request().useragent(),返回原始字符串,需用第三方库如 github.com/mssola/useragent 解析,且须校验非空并结合关键词扫描识别微信等环境。

ctx.Request().UserAgent() 是最直接的方式
Iris 没有封装专用的 ctx.UserAgent() 方法,必须从原始 HTTP 请求里取。正确写法是:ctx.Request().UserAgent(),它返回一个 string,内容就是原始的 User-Agent 头值。
注意:这个字符串未经任何解析,是纯文本,比如 "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X)..."。别指望它自动帮你拆出浏览器名或系统——那是解析库的事,不是框架该干的活。
常见错误:
- 误用
ctx.Header("User-Agent"):虽然也能拿到,但不如Request().UserAgent()稳定(某些中间件可能覆盖 Header) - 在中间件里提前调用
ctx.Request().Body后再取 UA:Body 读取会消耗请求体,可能导致后续解析失败
解析 UA 需要额外引入 useragent 库
拿到原始字符串后,得靠第三方库做语义提取。推荐 github.com/mssola/useragent,轻量、无依赖、更新勤快。
基本用法:
ua := useragent.Parse(ctx.Request().UserAgent()) browserName := ua.Browser().Name // 可能是 "Safari"、"Chrome Mobile"、""(未识别) osName := ua.OS().Name // 可能是 "iOS"、"Android"、""
关键提醒:
- 永远检查
ua.Browser().Name != ""再使用,空字符串很常见(如爬虫 UA"Go-http-client/1.1") - 别用
== "Chrome"判断,改用strings.Contains(ua.Browser().Name, "Chrome"),因为移动端返回的是"Chrome Mobile" - 微信内置浏览器识别为
"MQQBrowser",不是"WeChat";支付宝是"AlipayClient",需手动字符串扫描
高频场景:区分微信/WebView 要手动查 UA 字符串
useragent.Parse() 能识别 Safari、Chrome、iOS WebView,但无法告诉你“当前是否在微信内打开”。因为微信和 QQ 的 UA 伪装策略不统一,且解析库不内置这类业务逻辑。
安全做法是两步走:
- 先用
useragent提基础信息(设备类型、OS、浏览器) - 再对原始 UA 字符串做关键词扫描:
strings.Contains(uaStr, "MicroMessenger")、strings.Contains(uaStr, "QQ/")、strings.Contains(uaStr, "AlipayClient") - iOS 微信 UA 含
"iPhone OS",Android 微信含"Android",但ua.OS().Name仍能正确返回"iOS"或"Android",所以 OS 判断可信赖
性能与并发:别在 handler 里反复 new Parser
如果你用的是更重的 uap-go(基于 regexes.yaml),初始化成本高。它的 Parser 实例必须全局复用,且显式加载规则文件,否则所有字段都是空。
错误示范:parser := uap.New() 放在 handler 里 → 每次请求都编译正则,CPU 直接飙高。
正确姿势:
- 全局声明:
var parser = uap.New(uap.WithYamlFile("regexes.yaml")) - 限制缓存:
uap.New(uap.WithCacheSize(1000)),防内存溢出 - 只关心设备类型?用
parser.ParseShort(uaStr),比完整解析快 3–4 倍
UA 字符串本身不可信,别拿它做权限校验或安全决策——它能被任意篡改。











