2017-03-06 43 views
1

我正在尝试实现一个Web扩展,它可以从链接中删除重定向中间件。例如,当您点击从vk.com(社交网络)到外国网站的任何链接时,您将被导航到https://vk.com/away.php?to=URL_GOES_HERE为什么在browser.webNavigation.onBeforeNavigate时webRequest.onBeforeSendHeaders不提供查询字符串呢?

当你听onBeforeNavigate事件这样的:

browser.webNavigation.onBeforeNavigate.addListener(
    (details) => { 
     console.log('before navigate', details); 
    }, { 
     url: [ 
      {hostContains: "vk.com"} 
     ] 
    } 
); 

你会得到完整的URL:before navigate Object { url: "https://vk.com/away.php?to=URL_GOES_HERE", timeStamp: 1488807415002, frameId: 0, parentFrameId: -1, tabId: 2 }

但是你没有选择,以取代另一个URL的导航作用。你有这种能力只为webRequest API:

browser.webRequest.onBeforeSendHeaders.addListener(
    (details) => { 
     console.log('before web request', details) 
    }, 
    {urls: [ 
     '*://vk.com/away.php' 
    ]}, 
    ['blocking', 'requestHeaders'] 
); 

但URL有不包含查询参数:before web request Object { requestId: "1", url: "http://vk.com/away.php", originUrl: "https://vk.com/feed", method: "GET", type: "main_frame", timeStamp: 1488807415092, frameId: 0, parentFrameId: -1, tabId: 2, requestHeaders: Array[6] }

为什么工作这么?这是一个错误还是什么?

回答

1

Documentation未明确指出查询字符串被隐式视为URL路径的一部分。因此最后需要星号。以下代码可用于删除中间请求:

browser.webRequest.onBeforeRequest.addListener(
    (details) => { 
     let url = new URL(details.url), param; 
     switch (url.hostname) { 
      case 'vk.com': 
       param = 'to'; 
       break; 
      default: 
       param = 'url'; 
     } 
     let direct = new URLSearchParams(url.search).get(param); 
     console.log('DIRECT: ' + direct + ' (' + url + ')'); 
     return {redirectUrl: direct} 
    }, 
    {urls: [ 
     '*://vk.com/away.php?*', 
     '*://www.google.ru/url?*', 
     '*://www.google.com/url?*', 
    ]}, 
    ['blocking'] 
); 
相关问题