Nginx可通过$http_user_agent变量识别客户端类型,推荐用map指令预处理为$device_type标签(如mobile、weixin),再动态proxy_pass至对应upstream;User-Agent可伪造,仅用于体验优化,不可用于安全鉴权。

在 Nginx 网关中,通过 $http_user_agent 变量可以轻松识别客户端类型,并据此将请求路由到不同后端服务。这在移动端适配、爬虫拦截、旧版客户端分流等场景中非常实用。
识别并提取 User-Agent 关键特征
Nginx 的 $http_user_agent 是一个内置变量,自动捕获请求头中的 User-Agent 字符串。它区分大小写,且可能包含空格、斜杠、括号等特殊字符,因此匹配时推荐使用正则或内置的 map 指令做预处理。
- 直接在
location或if中用正则判断(简单但不推荐高频使用) - 更推荐用
map提前归类,提升性能和可读性 - 注意:User-Agent 可被客户端伪造,仅用于体验优化,不可用于安全鉴权
用 map 指令实现轻量级设备分类
在 http 块中定义映射关系,将复杂的 UA 字符串转为简洁的标签(如 mobile、desktop、weixin),后续路由逻辑更清晰:
map $http_user_agent $device_type {
default desktop;
~*android|iphone|ipad mobile;
~*MicroMessenger weixin;
~*curl|httpie api_test;
}上述配置会把含 Android/iPhone/iPad 的请求标记为 mobile,微信内置浏览器标为 weixin,命令行工具标为 api_test,其余默认为 desktop。
基于 device_type 实现后端路由分发
在 server 或 location 中,结合 proxy_pass 和变量,动态选择 upstream:
upstream backend_mobile { server 10.0.1.10:8080; }
upstream backend_desktop { server 10.0.1.20:8080; }
upstream backend_weixin { server 10.0.1.30:8080; }
<p>location /api/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;</p><pre class="brush:php;toolbar:false;">proxy_pass http://backend_$device_type;
}
只要 $device_type 的值是 mobile、desktop 或 weixin,Nginx 就会自动拼接出对应 upstream 名称并转发。注意:proxy_pass 后不能跟 URI 路径(如 /api/),否则变量拼接会失效。
补充:拦截恶意 UA 或测试流量
除了路由,也可用类似逻辑做快速拦截或打标:
map $http_user_agent $is_blocked {
~*python-requests|scrapy|badbot 1;
default 0;
}
<p>server {
if ($is_blocked) {
return 403 "Access denied.";
}</p><h1>... 其他配置</h1><p>}</p>注意:if 在 location 外使用有局限,建议仅用于简单返回;复杂逻辑仍推荐用 map + error_page 或结合 Lua 做增强。










