冻结用户代理字符串
Chrome 以及其他主要浏览器即将冻结 User-Agent 字符串,这引发了广泛关注。这意味着 User-Agent 字符串仍然存在(出现在请求头中,并可在 JavaScript 中通过 navigator.userAgent
访问),但其用于检测浏览器/平台/版本的功能将随着时间的推移而降低。谷歌官方解释此举是为了保护用户隐私,防止指纹识别。
前端开发领域一直建议:避免 User-Agent 探测。许多网站错误地使用 User-Agent 探测,导致弊大于利。避免 User-Agent 探测的最佳方法是:基于实际需求进行测试。
需要测试浏览器是否支持特定功能?直接测试该功能,而不是依赖于假设该浏览器应该支持该功能的抽象概念。
在 JavaScript 中,许多功能的测试非常简单,只需检测其 API 是否存在:
if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(showPosition); } else { console.warn("Geolocation not supported"); }
在 CSS 中,可以使用 @supports
原生机制:
@supports (display: grid) { .main { display: grid; } }
这可以通过返回布尔值的 JavaScript API 来检测:
CSS.supports("display: flex");
并非所有 Web 平台功能都如此易于测试,但通常无需 User-Agent 探测即可完成测试。如果遇到困难,可以查看 Modernizr 是否提供相应的测试,Modernizr 是功能测试的黄金标准,因为它经过了充分的测试,并处理了您可能无法预见的边缘情况。使用 Modernizr 库可以获得清晰的逻辑分支:
if (Modernizr.requestanimationframe) { // 支持 } else { // 不支持 }
如果确实需要知道浏览器类型、平台和版本,可以使用 User-Agent Client Hints (UA-CH)。
例如,要获取平台信息,可以在请求中设置 Sec-CH-Platform
头,理论上,可以在响应中获取该信息。这需要主动请求信息,从而避免了有问题的隐私指纹识别问题。类似地,还有 Sec-CH-Mobile
头用于检测移动设备,但这引发了一些疑问:谁来决定什么是“移动”设备?我们应该如何根据此信息做出决策?
在服务器端了解浏览器、平台和版本信息通常也是可取的(在不同情况下发送不同的代码),这与客户端一样重要,但服务器端无法进行测试。冻结的 User-Agent 字符串应该能够维持足够长的时间,以便服务器端能够迁移到使用 UA-CH。
Jon Arne Sæterås 对此表示担忧:
我在移动 Web 领域工作了 15 多年,我知道许多大大小小的网站都依赖于基于 User-Agent 头的设备检测。从 Google 的角度来看,切换到 UA-CH 似乎很容易,但这正是推动这一变化的团队没有理解其影响的地方:
基于设备检测的功能至关重要,应用广泛,不仅存在于前端代码中。大型软件系统及其后端代码依赖于设备检测,整个基础设施堆栈也是如此。
在我的主要代码库中,我们进行少量服务器端 UA 检测。我们使用一个名为 Browser 的 Rails gem,它以友好的 API 方式公开 UA 派生的信息。我可以这样写:
if browser.safari? # Safari 代码 end
我们还在客户端公开该 gem 中的信息,以便在客户端使用。前端和后端只有少数几个使用实例,这些实例似乎都可以通过其他方式轻松处理。
过去,将前端信息以在第一页加载时有用的方式传递回服务器有点棘手(因为 UA 不知道视口大小等信息)。我记得我做过一些非常巧妙的操作,加载一个骨架页面,执行一小段 JavaScript 代码来测量视口宽度和屏幕大小,然后设置一个 cookie 并强制刷新页面。如果存在 cookie,服务器将拥有所需的信息,并且在这些请求中根本不会加载骨架页面。
这很复杂,但服务器可以获取服务器端的视口宽度信息,这对于发送小屏幕资源(例如不同的 HTML)等操作非常有用,否则这是不可能的。
我之所以提到这一点,是因为 UA-CH 不应与普通的客户端提示混淆。我们应该能够配置服务器发送 Accept-CH
头,然后让客户端代码将要发送回的信息列入白名单,例如:
<meta content="DPR, Viewport-Width" http-equiv="Accept-CH">
这意味着服务器可以在后续页面加载中获取客户端的这些信息。这是一个不错的 API,但 Firefox 和 Safari 不支持它。如果这两个浏览器都因为冻结的 UA 字符串而对 UA-CH 表示兴趣,我想知道它是否会得到提升。
以上是冻结用户代理字符串的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

关于Flex布局中紫色斜线区域的疑问在使用Flex布局时,你可能会遇到一些令人困惑的现象,比如在开发者工具(d...
