nginx 可基于 $http_user_agent 对静态资源实现差异化处理:动态切换 root 路径、限速/拦截恶意 ua、按 ua 设置缓存与响应头、提供兼容性降级资源,全部在 nginx 层完成,无需后端参与。

配置 Nginx 对静态资源按特定 User-Agent 做差异化处理,核心是结合 $http_user_agent 变量与条件逻辑,在 location 块中实现分流、限流、跳转或权限控制。不需改写后端,纯靠 Nginx 规则即可生效。
区分 UA 返回不同静态路径
适用于 PC/H5 分站、内部工具专用资源等场景。Nginx 支持在同一个 location 中根据 UA 动态切换 root 或 alias:
- 在
location /static/块内,用if判断 UA 并重设root - 例如:移动端 UA 访问
/static/logo.png时,实际从/var/www/mobile/static/读取;PC 端走默认/var/www/pc/static/ - 注意:
if在 location 中可用,但不能嵌套;root会与请求 URI 拼接,需确保路径结构一致
对特定 UA 禁用或限速静态资源
防止爬虫高频拉取图片、JS、CSS 等,可直接拦截或加限速:
- 用
if匹配恶意 UA(如~* "sqlmap|wget|curl"),搭配return 403或deny all - 更柔和的方式是启用限速:先定义限速区
limit_req_zone $http_user_agent zone=ua_static:10m rate=1r/s,再在静态 location 中加limit_req zone=ua_static burst=3 nodelay - 仅对匹配的 UA 生效,其他用户不受影响
按 UA 注入不同响应头或缓存策略
比如对调试工具(Postman、curl)返回完整 headers 和长缓存,对浏览器客户端返回短缓存并隐藏敏感头:
- 用
map预定义 UA 类型变量,如map $http_user_agent $cache_ttl { default "1h"; "~*Postman|curl" "1d"; } - 在静态 location 中使用
expires $cache_ttl和add_header X-UA-Profile "$cache_ttl" - 避免在非目标 UA 响应中写入调试头,保证生产环境安全性
为特定 UA 提供降级静态资源
面向老旧浏览器(如 IE)或低性能设备,可自动替换高清图、现代 JS 为兼容版本:
- 利用
try_files实现 fallback:例如请求/js/app.js,先找/js/app.ie.js(若 UA 含MSIE) - 配合
rewrite重写路径:当 UA 匹配~* "iPhone.*OS 12",把/images/banner.jpg改写为/images/banner-ios12.jpg - 所有操作都在 Nginx 层完成,后端无感知,响应更快











