Manifest V3下Chrome扩展Declarative Net Request规则失效及测试咨询
先修正你的规则错误(这是未生效的核心原因)
你的rules.json存在几个关键问题:
- 条件匹配错误:
regexFilter是用来匹配请求URL的,不是响应头。要针对响应头Content-Security-Policy进行匹配,应该使用responseHeaderFilter字段。 - 目标Header名称错误:你要修改的是响应头
Content-Security-Policy,而不是script-src——script-src是CSP头里的一个指令,不是独立的响应头。 - 动作参数错误:直接
set整个script-src作为header是无效的,需要针对Content-Security-Policy头进行修改,比如用append操作添加新的源,或者用modify替换现有指令。
修正后的示例规则(以添加localhost:7000到script-src为例):
[ { "id": 1, "priority": 1, "action": { "type": "modifyHeaders", "responseHeaders": [ { "header": "Content-Security-Policy", "operation": "append", "value": " script-src https://localhost:7000;" } ] }, "condition": { "responseHeaderFilter": ["content-security-policy"], "resourceTypes": ["main_frame"] } } ]
测试响应头是否被修改的方法
Chrome开发者工具网络面板
- 打开目标页面,按下F12打开开发者工具,切换到「网络」标签。
- 刷新页面,找到类型为
document的主请求(对应main_frame资源类型)。 - 点击该请求,在右侧「响应头」区域查找
Content-Security-Policy,查看是否包含你添加的https://localhost:7000。
查看规则匹配状态
- 确保你的扩展已开启
declarativeNetRequestFeedback权限(你已经在manifest里添加了)。 - 打开
chrome://extensions/,开启开发者模式,找到你的扩展,点击「检查视图」打开Service Worker的控制台。 - 在控制台输入
chrome.declarativeNetRequest.getMatchedRules()并执行,查看返回结果里是否有你的规则ID(1),如果有则说明规则已匹配;如果没有,检查规则的条件是否符合请求。 - 也可以打开
chrome://net-internals/#events,在搜索框输入declarative_net_request,查看相关事件日志,确认规则是否被正确应用。
- 确保你的扩展已开启
验证CSP实际生效情况
在目标页面的控制台中,尝试加载https://localhost:7000下的脚本,比如:const script = document.createElement('script'); script.src = 'https://localhost:7000/test.js'; document.body.appendChild(script);然后查看开发者工具的「控制台」是否有CSP报错,如果没有报错且脚本加载成功,说明CSP修改生效。
内容的提问来源于stack exchange,提问作者Yash Falke
相关产品推荐
相关产品推荐

