Chrome扩展Manifest V3:declarativeNetRequest重定向规则配置错误排查
问题分析与修正方案
存在的错误
- 重定向规则的
urlFilter匹配了错误域名test.example.com,而非目标www.dmm.com,若存在旧的全局代理规则残留,就会出现所有网站被代理的异常 - 重定向URL使用固定字符串,无法保留原请求的路径后缀(比如原请求的
/things无法传递到新URL) host_permissions未包含重定向目标域名kcwiki.github.io,可能触发权限限制导致重定向失败
修正后的代码
manifest.json
{ "manifest_version": 3, "name": "Dynamic Declarative Redirect Extension", "version": "1.0", "permissions": [ "declarativeNetRequest" ], "host_permissions": [ "file:///*", "*://*.dmm.com/*", "*://kcwiki.github.io/*" // 新增重定向目标域名权限 ], "background": { "service_worker": "background.js" }, "web_accessible_resources": [ { "resources": [ "*/*" ], "matches": [ "*://www.dmm.com/*", "*://osapi.dmm.com/*", "*://kcwiki.github.io/*" ] } ] }
background.js
const initialRules = [ { id: 1, priority: 1, action: { type: 'redirect', redirect: { // 使用transform保留原路径,替换域名和前缀 transform: { scheme: "https", host: "kcwiki.github.io", pathPrefix: "/cache" } } }, condition: { // 精准匹配www.dmm.com的所有请求,可按需调整resourceTypes urlFilter: "*://www.dmm.com/*", resourceTypes: ["main_frame", "xmlhttprequest", "script", "style"] } } ]; chrome.runtime.onInstalled.addListener(async () => { // 清理旧规则 const oldRules = await chrome.declarativeNetRequest.getDynamicRules(); await chrome.declarativeNetRequest.updateDynamicRules({ removeRuleIds: oldRules.map(r => r.id) }); // 添加新规则 await chrome.declarativeNetRequest.updateDynamicRules({ addRules: initialRules }); console.log("重定向规则已设置"); });
说明
- 使用
transform而非固定URL,可自动将https://www.dmm.com/xxx重定向为https://kcwiki.github.io/cache/xxx,完美保留原路径 - 扩展了
resourceTypes,确保各类资源请求都能被正确重定向,可根据实际需求删减 - 新增了
kcwiki.github.io的主机权限,避免权限不足导致的重定向失败
内容的提问来源于stack exchange,提问作者Kwang Sing
相关产品推荐
相关产品推荐

