如何在特定站点禁用Chrome扩展?Manifest与正则配置报错求助
解决Chrome扩展在特定站点禁用/排除注入的问题
我来帮你一步步解决这两个问题,同时给出最佳实践方案:
一、修复Content Script的exclude_matches报错
你遇到的Empty path错误,是因为Chrome的匹配规则要求exclude_matches的每一项必须包含路径部分,不能只写主机名。把你的规则改成下面这样就行:
"content_scripts": [{ "matches": ["<all_urls>"], "exclude_matches": ["*://*.pannus.*/*"], "js": ["content.js"], "css": [ "style.css" ] }]
这里的/*表示匹配该域名下的任意路径,这样就符合Chrome的格式要求了,Content Script就不会注入到所有包含.pannus.的站点里。
二、修复PageStateMatcher的正则表达式错误
Chrome的declarativeContent.PageStateMatcher使用的是RE2正则引擎,它不支持Perl风格的负向前瞻(?!...)语法。你不需要用复杂的负前瞻,直接用urlDoesNotMatch来反向匹配更简单:
chrome.declarativeContent.onPageChanged.removeRules(undefined, function() { chrome.declarativeContent.onPageChanged.addRules([{ conditions: [ new chrome.declarativeContent.PageStateMatcher({ pageUrl: { schemes: ['https', 'http'], urlDoesNotMatch: '\\.pannus\\.' }, }) ], actions: [new chrome.declarativeContent.ShowPageAction()] }]); });
注意这里要把.转义成\\.,因为正则里.是通配符,我们要匹配字面量的点。这样配置后,Browser Action只会在不包含.pannus.的站点显示。
三、最佳实践方案
如果你的需求是既不注入Content Script,又不在目标站点显示Browser Action,建议把两种方式结合起来:
- 用
content_scripts的exclude_matches(正确格式)阻止脚本注入,这是最直接的方式,避免不必要的资源加载。 - 用
declarativeContent的规则控制Browser Action的显示,提升用户体验,让用户清楚扩展在当前站点是否生效。
另外,如果你后续升级到Manifest V3(你当前用的是V2),逻辑类似,只是browser_action改成了action,background的写法略有不同,但匹配规则和正则限制是一致的。
内容的提问来源于stack exchange,提问作者Ben Taliadoros
相关产品推荐
相关产品推荐

