最近给主题评论区加UA判断,判断评论者是什么操作系统,博客程序本身就存了评论者的User-Agent,只要针对User-Agent进行判断系统就行了。

>思路

实际操作时发现windows10windows11User-Agent没有任何区别,经过一番查询看到了《使用用户代理客户端提示检测 Windows 11》这篇文章,大致的意思就是Windows11不在支持通过User-Agent检查客户端系统版本了,而是采用新的方式。

里面给了个js判断的方法,此方法部分浏览器还不支持,Microsoft Edge 94 及以上,Chrome 95 及以上,Opera支持,FirefoxInternet Explorer 11以及一众国产浏览器不支持。(国产浏览器都是基于比较老版本的chrome内核,很久都没跟进内核了)

于是乎我就想到了个中转方法,就是用js判断,然后存个cookie,然后php判断这个cookie,如果是windows11,就自动将用户的User-Agent里面windows10的参数改成windows11。这样就自己创造好了win10win11的区别。

>相关代码

JS代码

if(navigator.userAgentData){//判断当前环境是否支持
    navigator.userAgentData.getHighEntropyValues(["platformVersion"])
 .then(ua => {
   if (navigator.userAgentData.platform === "Windows") {//判断是否是Windows系统
     const majorPlatformVersion = parseInt(ua.platformVersion.split('.')[0]);
     if (majorPlatformVersion >= 13) {//判断是否是win11或以上
       document.cookie = "win11=true;path=/";//写入cookie
      }
   }
});}

部分PHP代码

$getAgent=$archive->request->getAgent();//获取默认的ua信息,$archive->request->getAgent()为typecho程序的,其他程序需要手动改成相应的变量。
if(isset($_COOKIE['win11'])){//判断cookie
$getAgent=str_replace("Windows NT 10.0","Windows NT 11.0",$archive->request->getAgent());//将win10的参数改成win11
}
//最后将$getAgent这个新变量重新递交给程序写入数据库

>问题

在经过两个站点的测试发现,navigator.userAgentData这玩意只对https的站点有效,也就是说除了对用户浏览器的要求外,还要求站长使用https才满足判断条件,尴尬早知道这么坑就不写了。

windows11