推荐使用 map 指令基于 $http_user_agent 变量匹配移动设备特征(如 android、ios、mobile 等)将请求归类为 mobile 或 desktop,并通过 $device_type 变量实现无 if 的反向代理分流,同时需在 cache key 中包含该变量以避免缓存冲突。

可以通过Nginx的 $http_user_agent 变量匹配常见移动设备特征,结合 if 指令或 map 指令实现请求自动分流——推荐使用 map,更高效、更清晰、避免 if 的潜在陷阱。
用 map 指令预定义设备类型
在 http 块中定义一个映射变量,将 User-Agent 字符串归类为 mobile 或 desktop:
http {
map $http_user_agent $device_type {
default desktop;
~*(android|ios|iphone|ipad|mobile|blackberry|webos|opera mini|iemobile|windows phone) mobile;
}
}说明:
• ~* 表示不区分大小写的正则匹配
• 正则覆盖主流移动系统和浏览器标识(如微信内置浏览器、QQ浏览器也含 mobile 或 android)
• 顺序重要:更具体的规则可放在前面,但此处 default desktop 放最后即可
在 server 块中根据 $device_type 分流
利用 try_files 或 rewrite + proxy_pass 将请求导向不同后端或静态路径:
server {
listen 80;
server_name example.com;
<pre class="brush:php;toolbar:false;">location / {
# 方式1:反向代理到不同后端服务
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
if ($device_type = mobile) {
proxy_pass http://mobile_backend;
break;
}
proxy_pass http://desktop_backend;
}}
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
更推荐无 if 的写法(避免嵌套限制):
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
<pre class="brush:php;toolbar:false;">proxy_pass http://$device_type'_backend';}
前提是已定义 upstream:
upstream desktop_backend { server 127.0.0.1:8080; }
upstream mobile_backend { server 127.0.0.1:8081; }补充建议与注意事项
• 优先级高于域名或路径:User-Agent 判断应在最外层 location 中完成,避免被子 location 覆盖
• 考虑微信/QQ 内置浏览器:它们 UA 中通常含 MicroMessenger 或 MQQBrowser,可加入 map 正则(如 micro_messenger|mqqbrowser)并视业务需要归入 mobile
• 支持手动切换入口:可在 URL 加参数(如 ?view=mobile),用 $arg_view 覆盖自动判断,提升用户体验
• 缓存注意:若开启 proxy_cache 或 CDN,需将 $device_type 加入 cache key(如 proxy_cache_key "$scheme$request_method$host$request_uri $device_type";),否则 PC 和移动用户可能互相命中缓存
验证与调试方法
• 用 curl 模拟请求:curl -H "User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X)..." http://example.comcurl -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)..." http://example.com
• 在日志中临时添加变量便于排查:log_format debug '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_user_agent" "$device_type"';


















