Nginx通过map指令匹配User-Agent关键词(如mobile、android、iphone、ipad)识别移动端请求,设$is_mobile为1,再用if结合proxy_pass分流至mobile_backend或pc_backend上游组,透传真实IP与设备类型。

直接用 User-Agent 实现移动端分流,核心是让 Nginx 在七层(HTTP 层)识别设备类型,并把请求导向不同后端集群。这不是靠域名区分,而是靠请求头里的 User-Agent 字符串自动判断,用户无感知,也不用记不同地址。
如何识别移动端请求
Nginx 本身不内置设备类型判断,但可通过 map 指令结合正则,把 $http_user_agent 映射为布尔变量。常见做法是匹配关键词如 mobile、android、iphone、ipad 等,注意大小写不敏感(用 ~*)。
-
map必须定义在http块顶层,不能放在server或location内 - 默认值设为
0(PC),匹配到任一移动关键词即设为1(移动端) - IPad 需单独处理——它 User-Agent 含
Mac OS X但属于平板,容易被误判为 PC,建议加ipad显式匹配
定义两套上游服务组
分离的前提是后端已部署两套逻辑:一套专供移动端(响应更快、接口更精简、适配触控),一套服务 PC(页面更复杂、功能更全)。Nginx 只负责路由,不参与业务逻辑。
- 用
upstream mobile_backend和upstream pc_backend分别声明两组服务器 - 每组内可搭配适合的负载策略:移动端常用
least_conn(减少长连接堆积),PC 端可用加权轮询(按机器性能分配) - 建议为每组配置
max_fails和fail_timeout,实现基础健康检查
在 server 块中完成条件转发
在 location / 或具体路径里,用 if 判断 $is_mobile 变量,再用 proxy_pass 转发到对应 upstream。注意:if 在 location 中使用是安全的,但不能嵌套或用于重写复杂逻辑。
- 转发前务必设置
proxy_set_header X-Real-IP $remote_addr和X-Forwarded-For,确保后端能拿到真实客户端 IP - 若后端需知道请求来源设备类型,可额外透传:
proxy_set_header X-Device-Type $is_mobile - 避免在
if中做重定向(如return 302),这会破坏透明分流,应严格走 proxy_pass
验证与调试要点
配置 reload 后不能只看首页是否打开,要确认分流真正生效:
- 用 curl 模拟不同 UA:
curl -H "User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X)" http://your-domain.com,观察响应内容或后端日志来源 IP - 检查 Nginx 错误日志(
error.log),常见错误包括 map 定义位置错、upstream 名称拼写不一致、proxy_pass 地址末尾漏斜杠导致路径错位 - 上线前建议加一个临时
location /debug,输出$http_user_agent和$is_mobile,方便快速排查识别逻辑











