如何在Manifest V3 Chrome扩展中重复执行重定向规则?
解决Chrome Manifest V3中declarativeNetRequest规则无法移除所有诅咒词的问题
问题分析
你当前的规则仅能移除第一个匹配的诅咒词,原因是declarativeNetRequest的正则替换默认是单次匹配,且规则默认只对初始请求触发一次。要移除所有实例,可通过以下两种方案实现:
方案一:利用多次重定向自动循环移除所有匹配项
Chrome的declarativeNetRequest会对重定向后的新请求重新评估规则,因此我们可以让规则匹配任意位置的单个诅咒词,每次重定向移除一个,直到没有匹配项为止(自动终止,不会无限循环)。
修改你的rules_1.json规则如下:
[ { "id": 1, "priority": 1, "action": { "type": "redirect", "redirect": { "regexSubstitution": "https://www.google.com/search?q=\\1\\2" } }, "condition": { "regexFilter": "^https?://www\\.google\\.com/search\\?q=(.*?)\\s?(?:dang|frickin)(.*)", "resourceTypes": ["main_frame"], "isUrlFilterCaseSensitive": false } } ]
- 添加
isUrlFilterCaseSensitive: false可忽略大小写匹配(可选) - 每次重定向后的URL会再次触发规则,直到所有诅咒词被移除
- 可通过
chrome://net-internals/#events或扩展详情页的规则匹配日志(需declarativeNetRequestFeedback权限)验证触发情况
方案二:使用动态规则一次性全局替换
如果不想依赖多次重定向,可在Service Worker中利用动态规则的自定义转换函数,一次性移除所有诅咒词(Chrome 110+支持)。
- 确保
manifest.json已包含所需权限(你当前的配置已满足) - 在
service_worker.js中添加如下逻辑:
chrome.runtime.onInstalled.addListener(() => { // 移除已有动态规则(如果存在)并添加新规则 chrome.declarativeNetRequest.updateDynamicRules({ removeRuleIds: [100], addRules: [ { "id": 100, "priority": 2, // 优先级高于静态规则,确保优先触发 "action": { "type": "redirect", "redirect": { "transform": { "queryTransform": { "addOrReplaceParams": [ { "key": "q", "value": (url) => { const query = new URL(url).searchParams.get('q'); // 全局替换所有匹配的诅咒词 return query.replace(/\s?(dang|frickin)/gi, ''); } } ] } } } }, "condition": { "urlFilter": "https://www.google.com/search?q=*", "resourceTypes": ["main_frame"] } } ] }); });
- 该方案通过自定义函数全局替换所有诅咒词,无需多次重定向,效率更高
- 动态规则优先级设为2,确保比静态规则先触发
关于updateStaticRules的说明
updateStaticRules仅用于启用/禁用静态规则集或调整其优先级,无法修改规则的正则或替换逻辑,因此不适合用来实现重复执行规则的需求。
内容的提问来源于stack exchange,提问作者Aaron Meese
相关产品推荐
相关产品推荐

