用 map 指令实现 UA 分流的核心是定义 $device 变量,统一识别移动端/PC端,并用于缓存键、后端路由及静态路径;支持 Cookie 手动切换并优先于 UA 判断。

用 map 指令实现基于 User-Agent 的移动端/PC 端缓存分流,核心是把设备类型提前归类为变量(如 $device),再通过该变量控制缓存键、后端路由或响应头,避免在 location 中频繁使用 if,既提升性能又增强可维护性。
一、定义 device 类型变量
在 http 块中用 map 指令统一识别 UA,生成标准化的设备标签:
- 推荐写法简洁覆盖主流:匹配 Android、iPhone、iPad、iPod、BlackBerry、WebOS、Opera Mini、Mobile Safari 等
- 大小写不敏感用
~*,未匹配项默认设为pc - 避免嵌套否定逻辑,防止正则回溯拖慢请求处理
示例配置:
map $http_user_agent $device {default "pc";
~* "(Android|iPhone|iPad|iPod|BlackBerry|WebOS|Opera Mini|Mobile Safari)" "mobile";
}
二、配合 fastcgi_cache 或 proxy_cache 隔离缓存
缓存错乱常因 PC 和移动页面共用同一 URL 却返回不同内容。解决关键是让缓存系统“感知”设备差异:
- 在
fastcgi_cache_key或proxy_cache_key中加入$device,例如:
fastcgi_cache_key "$scheme$request_method$host$request_uri$device"; - 这样 PC 请求 /index.php 和移动请求 /index.php 会生成两个独立缓存项
- 若用 CDN(如腾讯云 EdgeOne),还需加
add_header Vary "User-Agent";,确保边缘节点按 UA 分层缓存
三、联动后端路由或静态资源路径
分流不止于缓存,还可驱动实际内容分发:
- 搭配
upstream实现后端分离:移动端请求代理到backend-mobile,PC 走backend-pc - 静态站点可用
root动态切换:
root /usr/share/nginx/html/$device; - 注意:root 后路径必须存在,否则 404;建议提前建好
/html/pc和/html/mobile目录
四、支持用户手动切换并持久化偏好
自动识别可能误判,需提供“切换到电脑版/手机版”入口,并用 Cookie 尊重用户选择:
- 前端点击时设置 Cookie,如
device=pc或device=mobile - 在
map前优先读取 Cookie:
map $cookie_device $device {
default "";
~* mobile "mobile";
~* pc "pc";
}
map $http_user_agent $ua_device { ... }
map $cookie_device $device {
default $ua_device;
~* mobile "mobile";
~* pc "pc";
} - 这样 Cookie 有值时优先采用,为空时回落到 UA 自动识别

















