Safari扩展declarativeNetRequest修改自定义Header失效问题
Safari 16.5.2中declarativeNetRequest自定义请求Header失效问题
问题背景
已在manifest中配置declarativeNetRequestWithHostAccess权限,调用await browser.declarativeNetRequest.updateDynamicRules({ addRules: x })添加修改请求Header的规则时,自定义Headerx-source被判定无效(规则ID 100不被识别),但将Header名称改为Origin则可正常运行。该规则在Chrome、Edge、Firefox等浏览器均能正常生效,仅Safari 16.5.2(18615.2.9.11.10)出现此问题。
规则代码示例:
var x = [ { "id": 100, "priority": 1, "action": { "type": "modifyHeaders", "requestHeaders": [ {"header": "x-source", "operation": "set", "value": "test"} ] }, "condition": {"urlFilter": "https://*/*"} } ];
原因
Safari 16.x版本的declarativeNetRequestAPI存在Header名称支持限制:modifyHeaders动作仅允许修改标准HTTP请求Header,对自定义前缀(如x-*)的Header未提供支持,因此会判定这类Header名称无效。该限制在Safari 17及以上版本已被修复。
解决方案
方案1:使用webRequest API替代(兼容Safari 16.x)
放弃declarativeNetRequest,改用webRequestAPI手动修改请求Header,需在manifest中额外添加webRequest和webRequestBlocking权限:
browser.webRequest.onBeforeSendHeaders.addListener( (details) => { // 先移除已存在的x-source(若需覆盖原有值) details.requestHeaders = details.requestHeaders.filter(h => h.name.toLowerCase() !== 'x-source'); details.requestHeaders.push({name: 'x-source', value: 'test'}); return {requestHeaders: details.requestHeaders}; }, {urls: ['https://*/*']}, ['blocking', 'requestHeaders'] );
方案2:升级Safari版本
引导用户升级至Safari 17或更高版本,即可直接使用原declarativeNetRequest规则设置自定义Header。
验证说明
- 在Safari 17.1版本中测试原规则代码,
x-sourceHeader可被成功设置,规则无报错。 - 确保manifest中已正确声明对应主机权限(如
"https://*/*")与declarativeNetRequestWithHostAccess权限。
内容的提问来源于stack exchange,提问作者surya
相关产品推荐
相关产品推荐

