Service Worker注册失败:脚本URL协议不支持(Tampermonkey场景)
Tampermonkey脚本注册Service Worker报错解决
问题本质
浏览器的Service Worker安全规则明确要求:注册的脚本必须使用http/https协议,且与当前页面同源(或通过服务器配置Service-Worker-Allowed响应头放宽范围)。blob:、data:这类协议不在允许范围内,所以无论你怎么转换这两种URL,都会触发「脚本URL协议不支持」的错误。
可行解决办法
1. 托管脚本到目标页面同源地址
如果有权限操作目标网站的服务器,直接把Service Worker脚本放到目标域名下的路径(比如/sw.js),然后在Tampermonkey脚本里直接注册:
(async () => { try { const reg = await navigator.serviceWorker.register('/sw.js'); console.log('Service Worker注册成功:', reg); } catch (err) { console.error('Service Worker注册失败:', err); } })();
2. 配置服务器允许跨源注册(需服务器权限)
若脚本托管在外部域名(如GitHub Pages),需要在托管服务器的响应头中添加Service-Worker-Allowed: 目标页面域名,然后注册时指定scope参数:
(async () => { try { const reg = await navigator.serviceWorker.register('https://你的外部托管地址/sw.js', { scope: 'https://www.javascripttutorial.net/' }); console.log('Service Worker注册成功:', reg); } catch (err) { console.error('Service Worker注册失败:', err); } })();
注意:普通GitHub仓库的raw文件无法自定义响应头,此方法仅适用于支持配置响应头的托管平台(如Netlify、Vercel等)。
3. 关于你之前尝试的方法
你用GM_getResourceURL生成blob/data URL的方式,本质上不符合浏览器的Service Worker规则,所以必然报错,无需再尝试这种路径。
内容的提问来源于stack exchange,提问作者EnderKraken
相关产品推荐
相关产品推荐

