You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"]
);

你尝试的代码中的核心问题

  1. 规则添加后立即被移除:在同一个updateSessionRules调用中,你同时添加了ID为id的规则,又在removeRuleIds里指定了同一个ID,导致规则刚创建就被删除,完全无法生效。
  2. 只配置了一个URL的规则:漏掉了*://*.example.com/mwlite/manifest.json的拦截逻辑。
  3. 不必要的tabIds限制:原webRequest是全局生效的,而你添加了tabIds: tabMultiId,如果这个变量不是你目标标签页的ID,规则会对其他标签页失效。
  4. 资源类型可以简化:虽然你列了很多类型,但精准匹配目标资源的类型会更高效(比如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:

  1. 修改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"
      }
    ]
  }
}
  1. 在扩展根目录创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 16:17:28