Violentmonkey 用户脚本@exclude指令对特定URL失效问题排查
解决维基百科Vector脚本的无限循环问题
嘿,我帮你定位到了导致Firefox里无限循环的几个问题,咱们来逐个修复:
问题根源
- @exclude规则失效:你用的
@exclude /useskin=vector/正则写法不符合Violentmonkey的匹配规则,它没能正确识别包含useskin=vector的URL,尤其是当URL里有特殊字符(比如电影页面的*)时,匹配逻辑直接失效。 - 脚本缺少自我检查:即使@exclude规则工作正常,脚本本身没有先判断当前URL是否已经携带
useskin=vector参数,相当于少了一层防循环的保险。 - 手动截取URL的潜在错误:用
substring手动拆分URL和锚点的方式,在遇到特殊字符时容易出现意外行为,比如带*的页面路径会打乱截取逻辑。
修正后的脚本代码
// ==UserScript== // @name Wikipedia Vector // @namespace Violentmonkey Scripts // @match *://*.wikipedia.org/* // @exclude *://*.wikipedia.org/ // @exclude *://*.wikipedia.org/*?*useskin=vector* // @exclude *://*.wikipedia.org/*&*useskin=vector* // @grant none // @version 1.1 // @author - // @run-at document-start // ==/UserScript== (function() { 'use strict'; // 先检查当前URL是否已经包含useskin=vector参数,有则直接退出 const url = new URL(window.location.href); if (url.searchParams.has('useskin') && url.searchParams.get('useskin') === 'vector') { return; } // 安全添加参数,自动保留锚点和原有参数 url.searchParams.set('useskin', 'vector'); window.location.replace(url.href); })();
关键改进说明
- 更可靠的@exclude规则:改用通配符匹配所有包含
useskin=vector的URL,不管参数是在?后还是&后,完全避免正则匹配的歧义问题。 - 原生URL API处理参数:用浏览器原生的
URL对象操作参数,比手动截取字符串更安全,能自动处理特殊字符(比如*)和锚点,不会破坏原有URL结构。 - 双重防循环保障:既通过@exclude拦截目标URL,又在脚本开头主动检查参数,彻底杜绝无限跳转的可能。
这样修改后,不管是在Firefox还是其他浏览器,访问带特殊字符的维基百科页面都不会再出现无限循环问题啦。
内容的提问来源于stack exchange,提问作者combperm
相关产品推荐
相关产品推荐

