You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Manifest V3中能否实现带外部数据查询的条件式重定向?

问题

我们有一款供开发者快速设置特定URL重定向的Chrome扩展,用于跨不同客户站点调试,当前基于Manifest V2的webRequestBlocking实现。
其工作流程如下:

  • 匹配类似https://www.example.com/c1234/path/to/javascript.js的URL模式;
  • 提取匹配URL中的c1234部分,调用Web服务查询名为shortName的变量值;
  • 将原URL重定向至类似https://localhost/imp-{shortName}/javascript.js的新URL。

在Manifest V3中尝试使用declarativeNetRequest时,仅能通过正则表达式设置重定向规则,无法实现上述第二步中利用匹配URL片段从外部源查询变量的操作。

当前使用updateSessionRules API的代码如下:

chrome.declarativeNetRequest.updateSessionRules({ 
  addRules: [
  {
    id: 1,
    action: {
      type: 'redirect',
      redirect: {
        regexSubstitution: '\1://localhost/{shortName}/javascript.js'
      }
    },
    condition: {
      regexFilter: '^(https?):.+(example.com).+(c[0-9]+).+javascript.+$'
    }
  }
],
  removeRuleIds: [1]
});

在Manifest V2中,我们通过chrome.webRequest.onBeforeRequest在请求发起前拦截:

chrome.webRequest.onBeforeRequest.addListener(
  function(details) {
    return redirectOnMatch(details);
  },
  {
    urls : ["<all_urls>"]
  },
  ["blocking"]
);

其中redirectOnMatch函数会先检查URL是否匹配模式,若匹配则提取c1234并调用HTTP请求。

请问在Manifest V3中,是否有办法在请求发起前运行代码并设置重定向规则?

解决方案

在Manifest V3中,有几种方案可以实现请求发起前运行代码并完成带动态查询的重定向:

方案一:预缓存映射+动态更新会话规则

  1. 提前获取映射关系:在扩展启动或用户触发操作时,批量拉取所有cXXX与shortName的映射,存储到chrome.storage.local中。
  2. 生成会话规则:遍历缓存的映射数据,为每个cXXX生成对应的declarativeNetRequest重定向规则,通过updateSessionRules添加到当前会话。
  3. 按需更新:当映射关系变化时,重新生成规则并更新会话中的规则列表。

该方案符合Manifest V3的性能优化方向,但依赖提前获取数据,适合映射变动不频繁的场景。

方案二:使用webRequestAsyncBlocking权限(Chrome 113+)

从Chrome 113版本开始,webRequest API支持asyncBlocking权限,允许在拦截请求时执行异步操作,完全复刻Manifest V2的逻辑:

  1. 在manifest.json中声明权限:
{
  "permissions": ["webRequest", "webRequestAsyncBlocking", "<all_urls>"]
}
  1. 改写拦截逻辑:
chrome.webRequest.onBeforeRequest.addListener(
  async function(details) {
    // 匹配URL并提取cXXX部分
    const urlMatch = details.url.match(/^(https?):\/\/.*example.com\/(c[0-9]+)\/.*javascript\.js$/);
    if (!urlMatch) return;

    const [_, protocol, cId] = urlMatch;
    // 调用外部服务查询shortName
    const resp = await fetch(`你的查询接口?cId=${cId}`);
    const { shortName } = await resp.json();
    // 构造重定向URL
    const redirectUrl = `${protocol}://localhost/imp-${shortName}/javascript.js`;
    
    return { redirectUrl };
  },
  { urls: ["<all_urls>"] },
  ["asyncBlocking"]
);

注意事项:

  • 需使用Chrome 113及以上版本;
  • 异步查询的耗时建议控制在1秒内,避免影响页面加载;
  • 申请webRequestAsyncBlocking权限时,需在扩展审核时说明具体用途。

方案三:混合模式(预缓存+异步兜底)

对高频使用的cXXX提前生成会话规则缓存,遇到未缓存的cXXX时,先异步查询shortName,动态添加会话规则并缓存映射关系,后续请求直接匹配规则。

这种方案兼顾性能与灵活性,适合既有常用映射又有偶发新映射的场景。


内容的提问来源于stack exchange,提问作者antun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 03:45:33