Nginx 用 map 指令基于 User-Agent 实现移动端与 PC 端静默反代路由:在 http 块顶层将 $http_user_agent 映射为 $device_type,默认 desktop,匹配 android/iphone/ipad 等设为 mobile;再通过 upstream 定义 mobile_backend 和 pc_backend,最后在 location 中用 proxy_pass http://backend_$device_type 动态转发,不重定向、不改 URL、用户无感知。

用 Nginx 的 map 指令做移动端与 PC 端反代路由适配,关键是把 User-Agent 字符串映射成可判断的变量,再结合 upstream 动态转发。整个过程不改 URL、不重定向,用户无感知,后端也无需适配逻辑。
在 http 块顶层定义设备类型映射
map 必须写在 http{...} 最外层,不能放在 server 或 location 里。它把 $http_user_agent 映射为一个新变量(比如 $device_type),默认值设为 desktop,匹配到移动关键词就设为 mobile:
- 正则用
~*表示大小写不敏感 - 常见关键词包括
android、iphone、ipad、mobile、windows phone -
ipad要显式加进去——它 UA 里含Mac OS X,容易被漏判为桌面端
示例配置:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
map $http_user_agent $device_type {
default desktop;
~*[Mm]obi mobile;
~*[Aa]ndroid mobile;
~*[Ii]phone mobile;
~*[Ii]pad mobile;
~*[Ww]indows[ ]?[Pp]hone mobile;
}
声明两套上游服务组
后端需已部署两套独立服务:一套面向移动端(接口轻、响应快、适配触控),一套面向 PC(功能全、页面复杂)。Nginx 只负责路由,不参与业务:
- 用
upstream mobile_backend { server 192.168.1.10:8080; }定义移动端后端集群 - 用
upstream pc_backend { server 192.168.1.20:8080; }定义 PC 后端集群 - 建议为每组设置
max_fails=2 fail_timeout=30s,实现基础健康检查 - 移动端可用
least_conn,PC 端可用weight=3加权轮询
在 location 中动态 proxy_pass
在 location / 或具体 API 路径中,用 proxy_pass http://backend_$device_type 实现变量拼接转发:
- 只要
$device_type是mobile或desktop,Nginx 就自动拼出http://backend_mobile或http://backend_desktop -
proxy_pass后不能带 URI 路径(如/api),否则变量拼接会失效 - 必须透传真实 IP:
proxy_set_header X-Real-IP $remote_addr - 可选透传设备类型:
proxy_set_header X-Device-Type $device_type,方便后端做日志或灰度
注意 if 的使用边界
不要在 location 里用 if ($device_type = mobile) { return 302 ... } 做重定向——这会暴露跳转、破坏透明性,也影响 SEO 和缓存。反代适配的核心就是静默转发:
-
if只适合简单条件判断,比如配合set设置变量,但别嵌套、别重写复杂逻辑 - 所有分流逻辑应收敛到
proxy_pass+ upstream 变量拼接这一条路径 - 如果需要手动切换(比如用户点“桌面版”),可通过 Cookie 配合
map覆盖默认判断


















