Nginx正则Map配置问题:按浏览器版本与设备匹配资源包
问题排查与修复方案
你的Nginx配置之所以一直返回legacy-bundle,是因为两个关键错误:
1. 用错了核心变量
你用$http_user_request来匹配浏览器信息,但这个变量存的是用户请求的路径(比如/home),根本不包含Chrome版本、设备类型这些内容。要获取浏览器的标识信息,必须用$http_user_agent变量——这才是浏览器发送的、包含版本和设备细节的字符串。
2. 正则匹配规则过于死板
原正则里的\.:true无法匹配真实的User-Agent格式:比如Chrome的User-Agent是Mozilla/5.0 (Linux; Android 10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.105 Mobile Safari/537.36,版本号后面跟着一堆字符,你直接写\.:true会跳过这些内容,导致匹配失败。
修正后的完整配置
map $http_user_agent $is_mobile { default false; ~*Mobile true; # 通过User-Agent里的Mobile关键词判断是否为移动端 } map "$http_user_agent:$is_mobile" $modern_browser { default ""; # 匹配移动端Chrome 80及以上版本 ~*Chrome\/(8[0-9]|[9]\d|\d{3,}).*:true "modern-bundle"; # 匹配桌面端Chrome 70及以上版本 ~*Chrome\/(7[0-9]|[89]\d|\d{3,}).*:false "modern-bundle"; }
调试小技巧
可以在Nginx里加个临时路由,输出变量值来验证匹配是否生效:
location /test-agent { default_type text/plain; return 200 "User-Agent: $http_user_agent\nIs Mobile: $is_mobile\nModern Bundle: $modern_browser"; }
访问/test-agent就能看到各个变量的实际值,方便快速定位问题。
内容的提问来源于stack exchange,提问作者aniram_ocean
相关产品推荐
相关产品推荐

