Chrome强制升级Manifest V3后的又一个困扰:YApi请求自定义Uaer-Agent
forbidden headers
Chrome 出于安全策略,对某些敏感请求头(称为 forbidden headers),比如:
- User-Agent
- Referer
- Origin
- Host
这些请求头无法通过 JavaScript(比如 fetch 或 XMLHttpRequest)直接修改,即使是在扩展里。
webRequestBlocking
Manifest V2 支持 webRequest.onBeforeSendHeaders
来拦截请求,搭配 webRequestBlocking
权限,可以做到修改 User-Agent
,但是这些在 Manifest V3里都不再被支持。
根据 fetch
规范中的禁止修改的标头列表(Firefox 43 中实现了它),User-Agent 标头不再被禁止,现在可以设置在 Fetch 的 Headers 对象中,或者通过 XMLHttpRequest 的 setRequestHeader() 方法设置。但是,Chrome 会静默地从 Fetch 请求中丢弃这个标头(请参阅 Chromium bug 571722)。
YApi
YApi 调试需要借助浏览器扩展才能在网页上实时发送请求,Manifest V3的调整,会导致YApi无法再发送自定义的 User-Agent
,对于这个功能的依赖,目前无解。
可能的解决方案
- 配合 ExtensionManifestV2Availability 临时开启继续用旧扩展,但是有时效性
- 更换 Firefox 浏览器,但是YApi扩展的支持是个问题
- 通过自定义参数发送 User-Agent 到服务端然后代理或特殊处理,比如我的修改版增加了
X-YApi-User-Agent
这个头
参考文档
YApi Chrome Manifest V3 规范的扩展
Fetch规范
禁止修改的请求标头
Manifest V2 支持时间表