文章前言
最近在优化博客 顺带写了个显示 User-Agent
信息的插件
由于更新了Windows11
系统之后 系统内核不更改 一直都是 Windows10
内核
这件事折磨了我好久 但我在 泽泽社长 和 微软官方文档 看到了解决办法 以下是来自微软官方文档的说明
User-Agent字符串不会更新为区分Windows 11和Windows 10,也不会区分 CPU 体系结构。 建议不要使用User-Agent字符串来检索用户代理数据。 不支持User-Agent客户端提示的浏览器将无法区分Windows 11和Windows 10,也无法区分 CPU 体系结构。
使用User-Agent客户端提示检测Windows 11
在 Microsoft Edge (和 Google Chrome) 中,网站可以通过User-Agent客户端提示 (UA-CH) 来区分Windows 11用户和Windows 10用户。 可以在以下 UA-CH 请求标头中找到此信息:
标头字段 | 指示Windows 10的值 | 指示Windows 11的值 |
---|---|---|
Sec-CH-UA-Platform | Windows | Windows |
Sec-CH-UA-Platform-Version | 和 之间的 1.0.0 值 10.0.0 | 13.0.0 及更高版本 |
支持的浏览器
这里要注意的是 此项目 并不支持某些国产浏览器或者低于以下内核版本的
浏览器版本 | 是否支持 |
---|---|
Microsoft Edge 94+ | 支持 |
Chrome 95+ | 支持 |
Opera | 支持 |
Firefox | 不支持 |
Safari | 不支持 |
详情代码
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();
// 修改 User-Agent 的字符串
if(isset($_COOKIE['win11'])){
$newAgent = str_replace('Windows NT 10.0', 'Windows NT 11.0', $getAgent);
}else{
$newAgent = $getAgent;
}
// 保存修改后的 User-Agent 提交到评论数据库表
$db = Typecho_Db::get();
$db->query($db->update('comments')
->rows(array('agent' => $newAgent))
->where('coid = ?', $comment->coid));
文章结尾
以上代码均除了要满足用户浏览器要求 还要看站点是否为https协议
本篇文章到此结束~
感谢分享 学习了。
不错
找到了,Sec-CH-UA-Platform在Windows10和11下都是Windows,而你用了||,即或,就是只要第一个条件满足或者第二个条件满足都会显示"是windows11",应该用“&&”,即且。
我已经不弄了 PHP取不出HTTP_SEC_CH_UA_PLATFORM_VERSION 只能取出HTTP_SEC_CH_UA_PLATFORM
新版本Windows10貌似会被识别为Windows11
看看识别UA效果
好耶(☆ω☆)
厉害
点进来学习,没想到还失效了
我刚刚测试了一下 好像没失效
好耶
这就非常的尴尬
举个爪