为什么 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']
);
我正在尝试实现一个 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']
);