为什么webRequest.onBeforeSendHeaders在browser.webNavigation.onBeforeNavigate没有提供查询字符串时呢?

时间:2017-03-06 13:45:43

标签: firefox-webextensions

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

当您收听此类onBeforeNavigate事件时:

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

您将获得完整的网址:before navigate Object { url: "https://vk.com/away.php?to=URL_GOES_HERE", timeStamp: 1488807415002, frameId: 0, parentFrameId: -1, tabId: 2 }

但您无法用其他网址替换该导航操作。您只能使用webRequest API:

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

但其中的网址不包含查询参数: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 个答案:

答案 0 :(得分: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']
);