Javascript 从3xx获取重定向位置(URL):带有Web扩展名的重定向HTTP响应
这在普通的web JS中是不可能做到的。例如,以下代码的工作方式与您预期的不同:Javascript 从3xx获取重定向位置(URL):带有Web扩展名的重定向HTTP响应,javascript,google-chrome-extension,Javascript,Google Chrome Extension,这在普通的web JS中是不可能做到的。例如,以下代码的工作方式与您预期的不同: fetch(“https://crbug.com“,{重定向:“手动”}) 嗯。但在web扩展中有可能做到这一点吗 我需要获取URL的重定向位置。fetch仅允许您查看是否存在重定向,以及最终位置(不是中间位置,当重定向计数大于1时),并且仅在成功加载页面之后(我根本不想下载页面(甚至只下载HTTP头)–不从HTTP响应头的位置执行与页面的任何连接) 例如: 对于https://bit_ly/2ng6XCg*
fetch(“https://crbug.com“,{重定向:“手动”})
嗯。但在web扩展中有可能做到这一点吗 我需要获取URL的重定向位置。
fetch
仅允许您查看是否存在重定向,以及最终位置(不是中间位置,当重定向计数大于1时),并且仅在成功加载页面之后(我根本不想下载页面(甚至只下载HTTP头)–不从HTTP响应头的位置
执行与页面的任何连接)
例如: 对于
https://bit_ly/2ng6XCg
*我应该得到“”
“我应该得到”
因为“我应该得到”
*用
替换
感谢wOxxOm,我已经写下了我想要的:
function getRedirect(url) {
return new Promise((resolve) => {
let blockedURL;
function onRequest(details) {
//console.log("onBeforeRequest ", details);
if (details.url === blockedURL) {
setTimeout(() => {
chrome.webRequest.onBeforeRequest.removeListener(onRequest);
resolve(blockedURL);
});
return { cancel: true };
}
}
chrome.webRequest.onBeforeRequest.addListener(onRequest, { urls: ["<all_urls>"] }, ["blocking"]);
function onRedirect(details) {
//console.log("onBeforeRedirect", details);
blockedURL = details.redirectUrl;
chrome.webRequest.onBeforeRedirect.removeListener(onRedirect);
}
chrome.webRequest.onBeforeRedirect.addListener(onRedirect, { urls: ["<all_urls>"] });
fetch(url, { redirect: "follow" }).catch(console.warn);
});
}
在manifest.json中:
“权限”:[“”、“webRequest”、“webRequestBlocking”]
感谢wOxxOm,我已经写下了我想要的:
function getRedirect(url) {
return new Promise((resolve) => {
let blockedURL;
function onRequest(details) {
//console.log("onBeforeRequest ", details);
if (details.url === blockedURL) {
setTimeout(() => {
chrome.webRequest.onBeforeRequest.removeListener(onRequest);
resolve(blockedURL);
});
return { cancel: true };
}
}
chrome.webRequest.onBeforeRequest.addListener(onRequest, { urls: ["<all_urls>"] }, ["blocking"]);
function onRedirect(details) {
//console.log("onBeforeRedirect", details);
blockedURL = details.redirectUrl;
chrome.webRequest.onBeforeRedirect.removeListener(onRedirect);
}
chrome.webRequest.onBeforeRedirect.addListener(onRedirect, { urls: ["<all_urls>"] });
fetch(url, { redirect: "follow" }).catch(console.warn);
});
}
在manifest.json中:
“权限”:[“”、“webRequest”、“webRequestBlocking”]
您可以通过使用webRequest API:chrome.webRequest.onbeforereredirect.addListener(console.log,{url:['']})来实现这一点。问题是,我无法在该侦听器中动态声明阻止规则:那么您必须为所有URL声明第二个侦听器,并在onBeforeRequest事件中更早地执行此操作。在重定向侦听器中,您将设置一些全局变量,您将在第二个侦听器中使用这些变量来决定要执行的操作。谢谢,它可以工作。这很奇怪,但是动态侦听器删除(removeListener
)工作没有问题(添加–否(如我上面所述))。尝试删除setTimeout内的beforerequest侦听器。您可以使用webRequest API:chrome.webRequest.onBeforeRedirect.addListener(console.log,{URL:['']})来完成此操作。问题是,我无法在该侦听器内动态声明阻止规则:那么,您必须为所有URL声明第二个侦听器,并在onBeforeRequest事件中更早地执行此操作。在重定向侦听器中,您将设置一些全局变量,您将在第二个侦听器中使用这些变量来决定要执行的操作。谢谢,它可以工作。这很奇怪,但是动态侦听器删除(removeListener
)工作没有问题(添加–否(如我上面所述))。尝试删除setTimeout内的beforerequest侦听器。Todo:如果链接没有重定向。Todo:如果链接没有重定向。