我正在尝试设置允许访问由 nginx 服务器托管的静态网站的浏览器白名单。
我发现文档对指令的引用modern_browser
。
这看起来很有趣,但我仍有一些问题: - 如何检测 Chrome 浏览器?(假设我想检测 Chrome 60 和 Safari 11) - 我如何知道它是移动版 Chrome 还是 Safari?
答案1
modern_browser* 指令不仅对于当今的实际用途而言已经过时,而且现在也不再需要。您只需在正则表达式映射中匹配现在相关的浏览器即可。
假设你现在正在这样做:
modern_browser_value "modern.";
ancient_browser_value "unpatched.";
modern_browser gecko 60;
index index.${modern_browser}html index.${ancient_browser}html index.html;
以下完成类似的匹配,但允许更细粒度的控制:
map $http_user_agent $browser_prefix {
"~Mozilla/5.0 \(.+ rv:[6789][0-9]\.[0-9.]*\).* Firefox/[0-9.]*$" "modern."
"~Mozilla/5.0 \(Android" "unpatched.";
default "unpatched.";
}
index index.${browser_prefix}html index.html;
您可以以相同的方式使用结果$variable
,包括直接拒绝访问,例如
if ($browser_prefix = "unpatched.") {return 403;}
因为你的问题提到了白名单,以下是原因列表人们在不应该这样做的时候使用了浏览器检测:
- 解决浏览器错误
- 通常,通过更改标记或 JavaScript,可以更轻松地长期维护。通常,解决方法已在相应的浏览器错误跟踪器中提及
- 访问控制
- 如果你想滥用 User-Agent 字符串作为密码,你应该使用基本身份验证 - 它具有类似的安全属性,但它是为此目的而设计的,因此更加可靠
- 检测浏览器功能(例如它是否能够播放某些视频编解码器?)
- 您不会从用户代理字符串中得到答案。功能会一直添加到浏览器中,这样您就无法判断用户是否禁用了已发布功能或启用了尚未默认的功能。