我正在尝试实现一个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] }
为什么这样工作?这是一个错误还是什么?
答案 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']
);