Chrome扩展开发:如何通过declarativeNetRequest允许已拦截URL
解决Chrome扩展修改拦截规则动作的问题
Chrome的declarativeNetRequest静态规则确实没法直接修改参数(比如把block改成allow),只能通过以下两种方式实现需求:
方法一:使用动态规则替代静态规则
静态规则是从扩展包内的文件加载的,属于只读配置,没法修改动作类型。你可以完全改用动态规则来实现初始拦截、后续放行的逻辑:
初始添加拦截规则
在扩展启动时,通过API添加动态拦截规则:// 初始化拦截example.com chrome.declarativeNetRequest.updateDynamicRules({ addRules: [{ id: 1, priority: 1, action: { type: "block" }, condition: { urlFilter: "example.com", resourceTypes: ["main_frame"] } }] });满足条件时放行
当触发允许访问的条件时,要么直接删除拦截规则,要么添加优先级更高的允许规则覆盖它:- 删除拦截规则:
chrome.declarativeNetRequest.updateDynamicRules({ removeRuleIds: [1] }); - 添加允许规则(优先级更高,会覆盖拦截规则):
chrome.declarativeNetRequest.updateDynamicRules({ addRules: [{ id: 2, priority: 2, // 优先级必须高于拦截规则 action: { type: "allow" }, condition: { urlFilter: "example.com", resourceTypes: ["main_frame"] } }] });
- 删除拦截规则:
方法二:切换规则集
如果你想保留静态规则的形式,可以定义两套规则集,初始启用拦截规则集,满足条件时切换到允许规则集:
在manifest中配置双规则集
"declarative_net_request": { "rule_resources": [ { "id": "block_rules", "enabled": true, // 初始启用拦截规则 "path": "rules/block.json" }, { "id": "allow_rules", "enabled": false, // 初始禁用允许规则 "path": "rules/allow.json" } ] }其中
block.json里是拦截example.com的规则,allow.json里是允许访问的规则(或者空规则,只要禁用拦截规则集即可)。切换规则集状态
当满足条件时,通过API切换规则集的启用状态:chrome.declarativeNetRequest.updateEnabledRulesets({ enableRulesetIds: ["allow_rules"], disableRulesetIds: ["block_rules"] });
关键说明
静态规则的设计就是只读的,只能通过enabled字段控制启用/禁用,没法修改规则的action等参数。所以必须用动态规则或规则集切换的方式来实现“从拦截到允许”的逻辑切换。
内容的提问来源于stack exchange,提问作者rstoleriu
相关产品推荐
相关产品推荐

