nginx 默认透传原始 user-agent,等价于 proxy_set_header user-agent $http_user_agent;只要未显式覆盖或清空(如设为空字符串或固定值),后端即可获取真实 ua 用于设备识别等场景。

Nginx 默认就会把原始 User-Agent 透传给后端,不需要额外配置。只要没主动覆盖或清空它,后端就能拿到真实浏览器或 App 的 UA 字符串,用于设备识别、系统判断、版本分流等分析场景。
确认 UA 是否被正常透传
Nginx 内部默认行为等价于:proxy_set_header User-Agent $http_user_agent;
这个变量会自动提取客户端请求头里的 User-Agent 字段。只要你的配置里没写类似 proxy_set_header User-Agent ""; 或 proxy_set_header User-Agent "xxx"; 这样的覆盖语句,UA 就是原样转发的。
常见导致 UA 丢失的操作要避开
- 不要在
location块里误写proxy_set_header User-Agent "";(空字符串会删掉该头) - 避免在多个
proxy_set_header指令中重复定义User-Agent,后写的会覆盖前写的 - 如果用了
map或if动态设置 UA,需确保 fallback 分支也保留$http_user_agent
需要增强 UA 信息时的合理补充方式
有些业务希望在原始 UA 基础上加标记,又不破坏原有结构,可以这样写:
- 保留原 UA 并追加代理标识:
proxy_set_header User-Agent "$http_user_agent (via Nginx)"; - 区分移动端和桌面端(配合日志或后端路由):
map $http_user_agent $ua_type { default "unknown"; "~*mobile|android|iphone|ipad" "mobile"; "~*windows|macintosh|x11" "desktop"; } proxy_set_header X-UA-Type $ua_type;
验证是否生效的小技巧
在后端接口里打印或记录 User-Agent 请求头,用 curl 测试:
curl -H "User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X)" http://your-domain.com/api/test
看后端收到的 UA 是否与发送的一致。也可以在 Nginx access log 中加 $http_user_agent 字段临时观察。
不复杂但容易忽略











