Javascript 从3xx获取重定向位置(URL):带有Web扩展名的重定向HTTP响应

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*

这在普通的web JS中是不可能做到的。例如,以下代码的工作方式与您预期的不同:

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:如果链接没有重定向。