为什么 webRequest.onBeforeSendHeaders 不提供查询字符串而 browser.webNavigation.onBeforeNavigate 提供?

Why webRequest.onBeforeSendHeaders doesn't provide query string while browser.webNavigation.onBeforeNavigate does?

我正在尝试实现一个 Web 扩展,它从 link 中删除重定向中间体。例如,当您从 vk.com(社交网络)点击任何 link 到外国网站时,您将被导航到 https://vk.com/away.php?to=URL_GOES_HERE.

当您收听 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] }

为什么会这样?是错误还是什么?

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']
);