最近给主题评论区加UA判断,判断评论者是什么操作系统,博客程序本身就存了评论者的User-Agent
,只要针对User-Agent
进行判断系统就行了。
思路
实际操作时发现windows10
和windows11
的User-Agent
没有任何区别,经过一番查询看到了《使用用户代理客户端提示检测 Windows 11》这篇文章,大致的意思就是Windows11
不在支持通过User-Agent
检查客户端系统版本了,而是采用新的方式。
里面给了个js
判断的方法,此方法部分浏览器还不支持,Microsoft Edge 94
及以上,Chrome 95
及以上,Opera
支持,Firefox
,Internet Explorer 11
以及一众国产浏览器不支持。(国产浏览器都是基于比较老版本的chrome内核,很久都没跟进内核了)
于是乎我就想到了个中转方法,就是用js
判断,然后存个cookie
,然后php
判断这个cookie
,如果是windows11
,就自动将用户的User-Agent
里面windows10
的参数改成windows11
。这样就自己创造好了win10
和win11
的区别。
相关代码
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
才满足判断条件,尴尬早知道这么坑就不写了。
评论区