首页 > 解决方案 > 从 3xx 获取重定向位置 (URL):使用 Web 扩展重定向 HTTP 响应

问题描述

在普通的 web JS 中是不可能做到的。例如,以下代码无法按您预期的那样工作:

fetch("https://crbug.com", { redirect: "manual" })

出色地。但是可以在网络扩展中做吗?

我需要获取 URL 的重定向位置。仅允许您查看fetch是否有重定向,以及最终位置(不是中间位置,当重定向计数大于 1 时)并且仅在页面成功加载后(我根本不想下载页面(甚至只有 HTTP 标头)——不要与来自LocationHTTP 响应标头的页面执行任何连接)。


例如:

对于https://bit_ly/2ng6XCg* 我应该得到“ http://crbug.com

对于“ http://crbug.com ”,我应该得到“ https://crbug.com

对于“ https://crbug.com ”,我应该得到“ https://bugs.chromium.org/p/chromium/issues/list ”。


*替换_.

标签: javascriptgoogle-chrome-extension

解决方案


感谢 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);             
    }); 
}

让我们检查一下代码:

(async () => {
    console.log("URL Redirects to ", await getRedirect("http://crbug.com"));                    
    // "URL Redirects to https://crbug.com" 

    console.log("URL Redirects to ", await getRedirect(await getRedirect("http://crbug.com"))); 
    // "URL Redirects to https://bugs.chromium.org/p/chromium/issues/list"

    await fetch("http://crbug.com"); 
    // It works in common way (Fetch finished loading: GET "https://bugs.chromium.org/p/chromium/issues/list")  
})();

在 manifest.json 中: "permissions": ["<all_urls>", "webRequest", "webRequestBlocking"]


推荐阅读