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

Manifest V3下Firefox中declarativeNetRequest.updateDynamicRules修改Header无效

问题:Manifest V3扩展在Firefox中无法通过declarativeNetRequest修改HTTP请求头

问题描述

正在将修改HTTP请求头的浏览器扩展从Manifest V2迁移到Manifest V3,使用Chrome API的declarativeNetRequest.updateDynamicRules设置规则。相同代码在Chrome中运行正常,但在Firefox中完全没有效果。

Manifest V3配置

{
  "manifest_version": 3,
  "name": "modify-header",
  "short_name": "modify-header",
  "version": "1.0.0",  
  "icons": {
    "38": "assets/icons/icon-off.png"
  },
  "description": "Modify HTTP request ",
  "permissions": [
    "webRequest",
    "storage",
    "declarativeNetRequest",
    "declarativeNetRequestWithHostAccess",
    "tabs",
    "cookies"
  ],
  "host_permissions": [
    "<all_urls>"
  ],
  "action": {
    "default_popup": "index.html?#/popup",
    "default_title": "Modify Headers",
    "default_icon": "assets/icons/icon-off.png"
  },
  "options_page": "index.html?#/configuration", // For chrome 
  "background": {
    "service_worker": "serviceWorker.js" // For chrome 
    "scripts" : ["serviceWorker.js"] // For firefox
  }
}

Service Worker代码(Chrome API版本)

chrome.declarativeNetRequest.updateDynamicRules(
    {
        addRules: [{
            "id": 1,
            "priority": 1,
            "action": {
                "type": "modifyHeaders",
                "requestHeaders": [
                    { "header": "h2", "operation": "set", "value": "v2" },
                    { "header": "h3", "operation": "set", "value": "v3" }
                ]
            },
            "condition": {
                "urlFilter": "*",
                "resourceTypes": ["main_frame"]
            }
        }],
        removeRuleIds: [1]
    },
).then(() => {
    console.log('Rule has been added !');
}).catch((error) => {
    console.log('error:', error);
});

结果对比

  • Chrome网络检查结果:请求头已成功添加h2、h3字段
  • Firefox网络检查结果:请求头无任何变化

尝试过的方案

改用Firefox的browser API调用,但问题依旧:

browser.declarativeNetRequest.updateDynamicRules(
    {
        addRules: [{
            "id": 1,
            "priority": 1,
            "action": {
                "type": "modifyHeaders",
                "requestHeaders": [
                    { "header": "h2", "operation": "set", "value": "v2" },
                    { "header": "h3", "operation": "set", "value": "v3" }
                ]
            },
            "condition": {
                "urlFilter": "*",
                "resourceTypes": ["main_frame"]
            }
        }],
        removeRuleIds: [1]
    },
).then(() => {
    console.log('Rule has been added browser !');
}).catch((error) => {
    console.log('error:', error);
});

环境信息

  • Manifest版本:3
  • Chrome版本:113
  • Firefox版本:114
  • Firefox开发者版本:115

补充说明

排除了Firefox网络控制台不显示修改后请求头的可能性——因为扩展的业务逻辑未随请求头修改而变化,且block类型的规则可以正常执行。


解决方案

1. 修复Manifest.json语法错误

你的Manifest.json中background字段存在语法错误:Chrome的service_worker和Firefox的scripts之间缺少逗号,这会导致Firefox无法正确解析配置。修正后:

"background": {
    "service_worker": "serviceWorker.js", // For chrome 
    "scripts" : ["serviceWorker.js"] // For firefox
}

2. 调整规则优先级与执行逻辑

Firefox对declarativeNetRequest的规则优先级处理与Chrome存在差异,建议提升优先级(比如设置为10),同时确保规则更新逻辑更严谨:

// 适配Chrome和Firefox的通用写法
const browserAPI = chrome || browser;

browserAPI.declarativeNetRequest.updateDynamicRules({
  removeRuleIds: [1], // 先移除旧规则避免冲突
  addRules: [{
    "id": 1,
    "priority": 10, // 提高优先级确保规则生效
    "action": {
      "type": "modifyHeaders",
      "requestHeaders": [
        { "header": "h2", "operation": "set", "value": "v2" },
        { "header": "h3", "operation": "set", "value": "v3" }
      ]
    },
    "condition": {
      "urlFilter": "*",
      "resourceTypes": ["main_frame", "sub_frame", "xmlhttprequest"] // 覆盖更多请求类型
    }
  }]
}).then(() => {
  console.log('规则添加成功');
}).catch((error) => {
  console.error('规则添加失败:', error);
});

3. 验证权限配置

Firefox对Manifest V3的权限校验更严格,确保:

  • 已正确声明declarativeNetRequest和declarativeNetRequestWithHostAccess权限
  • host_permissions包含<all_urls>或目标请求的具体域名

4. 查看Firefox调试日志

在Firefox中打开about:debugging#/runtime/this-firefox,找到你的扩展点击「检查」,查看后台脚本的控制台输出,确认是否有规则添加失败的错误提示(比如格式错误、权限不足)。

5. 扩展资源类型覆盖范围

如果你的目标请求不是main_frame类型(比如AJAX请求属于xmlhttprequest),需要在resourceTypes中添加对应类型,确保规则覆盖到目标请求。


内容的提问来源于stack exchange,提问作者M.GoodMan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 04:00:48