Manifest V3中declarativeNetRequest无法替代webRequest实现URL拦截的问题咨询
解决Manifest V3中declarativeNetRequest替代webRequest拦截失效的问题
你的问题主要出在几个关键细节上,我来帮你拆解并给出完全等效的实现方案:
先分析原webRequest逻辑
你的原代码是全局拦截两个特定URL的所有请求并直接阻止,没有针对特定标签页或资源类型的额外限制:
chrome.webRequest.onBeforeRequest.addListener( function(){ return {cancel: true}; }, { urls: ["*://*.example.com/mwlite/service-worker.js", "*://*.example.com/mwlite/manifest.json"] }, ["blocking"] );
你尝试的代码中的核心问题
- 规则添加后立即被移除:在同一个
updateSessionRules调用中,你同时添加了ID为id的规则,又在removeRuleIds里指定了同一个ID,导致规则刚创建就被删除,完全无法生效。 - 只配置了一个URL的规则:漏掉了
*://*.example.com/mwlite/manifest.json的拦截逻辑。 - 不必要的tabIds限制:原webRequest是全局生效的,而你添加了
tabIds: tabMultiId,如果这个变量不是你目标标签页的ID,规则会对其他标签页失效。 - 资源类型可以简化:虽然你列了很多类型,但精准匹配目标资源的类型会更高效(比如
service-worker.js属于script类型,manifest.json属于other类型)。
正确的等效实现方案
方案1:动态会话级规则(临时生效,浏览器关闭后消失)
如果你需要动态添加/移除规则,使用updateSessionRules的正确写法如下:
// 生成唯一的规则ID(避免重复,这里用时间戳示例) const ruleId1 = Date.now(); const ruleId2 = ruleId1 + 1; // 添加拦截规则 chrome.declarativeNetRequest.updateSessionRules({ addRules: [ { id: ruleId1, priority: 1, action: { type: "block" }, condition: { urlFilter: "*://*.example.com/mwlite/service-worker.js", resourceTypes: ["script"] // 精准匹配脚本类型 } }, { id: ruleId2, priority: 1, action: { type: "block" }, condition: { urlFilter: "*://*.example.com/mwlite/manifest.json", resourceTypes: ["other"] // manifest属于other类型 } } ], // 如果需要移除旧规则,在这里填写旧的规则ID;不需要的话可以省略这个字段 // removeRuleIds: [oldRuleId1, oldRuleId2] });
方案2:静态规则(推荐,性能更高)
如果你的拦截规则是固定的,推荐直接在manifest.json中配置静态规则,不需要动态调用API:
- 修改
manifest.json,添加权限和规则引用:
{ "name": "你的扩展名称", "version": "1.0", "manifest_version": 3, "permissions": ["declarativeNetRequest", "*://*.example.com/*"], "declarative_net_request": { "rule_resources": [ { "id": "block_rules", "enabled": true, "path": "rules.json" } ] } }
- 在扩展根目录创建
rules.json文件,写入拦截规则:
[ { "id": 1, "priority": 1, "action": { "type": "block" }, "condition": { "urlFilter": "*://*.example.com/mwlite/service-worker.js", "resourceTypes": ["script"] } }, { "id": 2, "priority": 1, "action": { "type": "block" }, "condition": { "urlFilter": "*://*.example.com/mwlite/manifest.json", "resourceTypes": ["other"] } } ]
注意事项
- 确保扩展已声明
declarativeNetRequest权限和目标域名的主机权限(*://*.example.com/*)。 - 规则ID必须全局唯一,不能重复。
- 如果不需要针对特定标签页拦截,不要添加
tabIds字段,保持规则全局生效。
内容的提问来源于stack exchange,提问作者user1327579
相关产品推荐
相关产品推荐

