Nginx无法直接下发差异化静态资源包,需用map指令将UA归一为ios/android/other,再结合try_files路由分流或proxy_cache_key+$os_type实现缓存分离,仅当内容真实不同时才加Vary头。
不能直接“下发差异化静态资源包”——Nginx 本身不支持按 UA 动态替换文件路径;你真正能做的是:用
分类设备类型,再结合
或
实现路由分流,或靠缓存键隔离 + 前端逻辑适配。关键在“内容是否真不同”,否则加 Vary 只会拖慢缓存命中率。
用 map 指令稳定识别 iOS/Android 设备类型
别直接拿
做判断或参与缓存键——它太长、易变、CDN 处理不一致。应该先归一为简短枚举值:
→ 匹配所有常见 iOS UA(含 iPhone、iPad、Mac Catalyst)
→ 覆盖 Android 手机和平板主流 UA 格式
其余统一设为
,避免漏掉桌面或爬虫请求
配置必须放在
块顶层,例如:
静态资源真正差异化时才启用 Vary + 缓存键分离
如果同一 URL 下,iOS 和 Android 确实返回了不同内容(比如
里有 WebKit 专属 API 调用),才需要走缓存分离:
响应头必须加
,且头名建议用
而非
,语义清晰、CDN 兼容性好
必须包含
,否则两个系统会共用一个缓存条目:
若只是前端 JS 自行检测 UA 并差异化加载模块,后端资源完全一致,则
不要加 Vary
,否则缓存碎片化严重
不推荐用 rewrite 或 if 切换 root,改用 try_files 分流更安全
有人想用
,但 Nginx 官方明确不建议在
中用
改写
—— 容易出路径拼接错误或继承问题。更稳妥的做法是:
Android 操作系统的介绍 中文WORD版
本文档主要讲述的是Android 操作系统的介绍;Android是基于Linux内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统,早期由Google开发,后由开放手持设备联盟(Open Handset Alliance)开发。它采用了软件堆层(software stack,又名以软件叠层)的架构,主要分为三部分。底层Linux内核只提供基本功能;其他的应用软件则由各公司自行开发,部分程序以Java编写。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
把 iOS/Android 资源分别放独立子目录,如
和
用
按变量尝试路径:
配合
或
控制基础路径,确保 URI 映射准确
这样既避免
的陷阱,又保持配置可读性和调试便利性。
验证是否生效的关键检查点
光看配置没用,必须用真实请求验证:
用
和
分别请求,确认响应头都含
对比两次响应的
或
—— 若相同,说明缓存未真正分离
检查
中的
变量值是否符合预期,排查正则漏匹配(比如某些 Android TV UA 不含
字样)
最容易被忽略的是:Vary 头和缓存键必须同步更新,缺一不可;而且只在内容真有差异时才启用,否则就是在给缓存系统制造垃圾。
maplocationtry_files$http_user_agent~*[Ii]phone|iPad.*OS|iOS~*[Aa]ndroidotherhttpmap $http_user_agent $os_type {
default other;
~*[Ii]phone ios;
~*iPad.*OS ios;
~*iOS ios;
~*[Aa]ndroid android;
}app.jsadd_header Vary "X-OS-Type";X-OS-TypeUser-Agentproxy_cache_key$os_typeproxy_cache_key "$scheme$request_method$host$request_uri$os_type";if ($os_type = ios) { root /var/www/ios; }locationifroot/static/ios/app.js/static/android/app.jstry_filestry_files /static/$os_type$uri /static/other$uri =404;aliasrootifcurl -H "User-Agent: Mozilla/5.0 (iPhone"-H "User-Agent: Mozilla/5.0 (Linux; Android"Vary: X-OS-TypeContent-LengthETagaccess.log$os_typeAndroid