nginx 通过 map 提取 $device_type 统一标识终端类型,结合 vary 响应头、proxy_cache_key 包含设备变量及 server 块域名/路径分流,实现多端差异化响应与缓存隔离。

用 map 归一化设备类型,避免 UA 字符串污染逻辑
User-Agent 千变万化,不能直接拿它做判断依据。应在 `http { }` 块中统一用 `map` 指令提取稳定标识:map $http_user_agent $device_type {
~*"(iPhone|Android|Mobile|BlackBerry|Opera Mini)" "mobile";
~*"(MiniProgram|MicroMessenger|mp-weixin)" "weapp";
~*"(iPad|Tablet|Nexus 7|Kindle)" "tablet";
default "desktop";
}
按设备类型设置独立缓存策略,防止交叉污染
同一 URL 在不同设备上返回的内容可能不同(比如移动端精简 HTML、PC 端含侧边栏),若共用缓存,就会出现“手机用户看到 PC 版页面”的问题。- 在响应头中标记设备类型:add_header X-Device-Type $device_type;
- 告诉缓存系统该按设备区分:add_header Vary X-Device-Type;
- 若启用 `proxy_cache`,必须让缓存键包含设备类型:proxy_cache_key "$scheme$request_method$host$uri$device_type";
结合 server 块实现域名级或路径级分流
当业务需要物理隔离时(比如移动端走单独后端集群、证书策略或运维体系),推荐用 `server_name` 分流:- 为移动端单独配置子域名:server_name m.example.com;,绑定 RSA 证书 + TLSv1.2 兼容套件
- 主站保持高安全策略:server_name www.example.com;,用 ECC 证书 + TLSv1.3 + 强加密套件
- 也可在同域名下用路径区分:location /m/ { proxy_pass http://mobile_backend; },再配合 `if ($device_type = mobile)` 控制入口
不依赖 UA 的增强型适配(可选但推荐)
UA 可伪造,仅用于体验优化。更可靠的补充手段包括:- 读取云厂商透传的 X-Real-IP-Location 或 X-Device-Width 请求头(需客户端或 CDN 支持)
- 前端 JS 上报屏幕宽度或 touch 支持状态,后端通过 cookie 或 header 透传给 Nginx(如 $http_x_device_width)
- 对微信、支付宝等容器环境,可额外匹配 MicroMessenger 或 AlipayClient,归入 weapp 类别











