可在nginx中用map指令基于$http_user_agent预定义$device_group等变量,结合root或alias实现静态资源按设备自动分发;map须置于http{}顶层,支持大小写不敏感匹配与default兜底,root支持变量拼接路径,alias可用于精细路径分流,需避免根路径分流及安全误用。

可以在 Nginx 中通过 map 指令匹配 $http_user_agent,预定义设备类型变量,再结合 root 或 alias 实现静态资源按 iPhone、Android、桌面端等自动分发。关键在于提前映射、路径隔离、避免运行时重写。
用 map 提前识别设备类型
必须把 map 块写在 http{} 顶层,不能放在 server 或 location 内。它不执行逻辑判断,只做字符串模式匹配并赋值:
- 匹配移动端常见 UA 特征,如
iPhone、Android、Mobile(注意大小写不敏感写法~*) - 设置
default值,覆盖 UA 缺失、被篡改或未知设备的情况 - 变量名建议语义清晰,例如
$device_group或$static_root
用 root + 变量实现动态资源路径
root 指令支持变量拼接,适合按设备切换整个静态资源根目录。例如:
- 准备物理目录结构:
/usr/share/nginx/html/iphone/、/usr/share/nginx/html/android/、/usr/share/nginx/html/desktop/ - 在
server块中配置:location /static/ { root /usr/share/nginx/html/$device_group; } - 请求
/static/app.js在 iPhone 上实际读取:/usr/share/nginx/html/iphone/static/app.js - 确保 Nginx 进程对所有子目录有读取权限
用 alias 配合条件 location 更精细控制
如果只需对部分资源(如图片或 JS)做设备区分,且目录结构不完全一致,可用 alias + 多个 location 分流:
- 先用
map得到$device_type(值为mobile或desktop) - 写两个独立
location,分别匹配路径前缀,并用alias指向不同物理路径 - 例如:
location ^~ /js/ { alias /var/www/static/$device_type/js/; } - 注意
alias不支持变量拼接,但alias后接变量是合法的;而root支持变量且更常用
注意事项与避坑点
这类配置看似简单,但几个细节容易导致 404 或权限错误:
- 不要对
/根路径做设备分流,HTML 页面本身需保持一致,否则首屏渲染可能错乱 - 专注分流
/static/、/js/、/css/、/images/等纯静态路径 - UA 字符串可被轻易伪造,仅用于体验优化,不可用于安全控制
- 测试时用 curl 模拟不同 UA:
curl -H "User-Agent: Mozilla/5.0 (iPhone..." http://localhost/static/app.js











