当人们说他们想要进行“浏览器检测”的时候,他们实际上经常想要进行的是“渲染引擎检测”。你实际上想要检测使用的是火狐(Firefox)还是与之对应的海猴(SeaMonkey),或者使用的是 Chrome 还是与之对应的 Chromium?或者你实际上只不过想看浏览器是否正在使用 Gecko 还是 WebKit 渲染引擎?如果这正是你需要的,请参阅后面的部分。
除了 IE 浏览器这个显著的例外,大部分的浏览器以浏览器名/版本号的格式设置浏览器名和版本。但是由于浏览器名不是用户代理字符串中唯一一个以这种格式命名的信息,你不能发现浏览器名,你只能检测是否这是你正在寻找的名字。但是要注意到,一些浏览器在说谎:例如 Chrome 的用户代理字符串中既会包含 Chrome 又会包含 Safari。所以为了检测 Safari 浏览器,你不得不检测其中是否有 Safari 字符串同时没有 Chrome 字符串,Chromium 也经常汇报它自己是 Chrome 浏览器,海猴有时也汇报它自己是火狐浏览器。
也要注意不要对浏览器名使用简单的正则表达式,用户代理字符串中也包含不属于键值对形式的字符串。例如在 Safari 和 Chrome 中包含有“like Gecko”一样的字符串。
必须包含 | 禁止包含 | ||
---|---|---|---|
Firefox | Firefox/xyz | Seamonkey/xyz | |
Seamonkey | Seamonkey/xyz | ||
Chrome | Chrome/xyz | Chromium/xyz | |
Chromium | Chromium/xyz | ||
Safari | Safari/xyz | Chrome/xyz or Chromium/xyz | Safari 有两个版本号,一个技术性较强,格式是 Safari/xyz,一个对用户友好一点,格式是 Version/xyz |
Opera | OPR/xyz [1]Opera/xyz [2] | [1] Opera 15+ (基于 Blink 的引擎)[2] Opera 12- (基于 Presto 的引擎) | |
Internet Explorer | ; MSIE xyz; | IE 浏览器的名字并没有使用BrowserName/VersionNumber的格式 |
当然,这里并没有保证其他浏览器不劫持上述字符串(像在过去,Chrome 劫持了 Safari 的字符串)。这就是为什么使用用户代理字段进行浏览器检测是不可信的,并且做这个检测也仅仅应该是为了检测版本号(劫持过去的版本号这种事情很少发生)。