Javascript 收到响应后使用Chrome webRequest进行URL转发

Javascript 收到响应后使用Chrome webRequest进行URL转发,javascript,google-chrome,google-chrome-extension,webrequest,Javascript,Google Chrome,Google Chrome Extension,Webrequest,我正在尝试创建一个Chrome扩展,它利用Chrome的模块执行重定向到从最初访问的URL获得的URL。为此,我只想利用Chrome的webRequest函数(例如onBeforeSendHeaders、onHeadersReceived),而不是简单地使用获得的URL调用$.ajax()。所需的功能是: 用户在地址栏中输入URL 发出请求并从HTTP响应中提取辅助URL 处理程序使用阻塞响应的redirectUrl属性将用户重定向到此辅助URL 我试图做到这一点: chrome.webRequ

我正在尝试创建一个Chrome扩展,它利用Chrome的模块执行重定向到从最初访问的URL获得的URL。为此,我只想利用Chrome的webRequest函数(例如onBeforeSendHeaders、onHeadersReceived),而不是简单地使用获得的URL调用$.ajax()。所需的功能是:

  • 用户在地址栏中输入URL
  • 发出请求并从HTTP响应中提取辅助URL
  • 处理程序使用阻塞响应的redirectUrl属性将用户重定向到此辅助URL
  • 我试图做到这一点:

    chrome.webRequest.onHeadersReceived.addListener(
     function(details){
      var secondaryURL = extractSecondaryURL(details);
      return {redirectUrl: secondaryURL}; //this doesn't work
     },
     {urls:["http://*/*", "https://*/*"]},
     ["blocking","responseHeaders"]
    );
    
    …但该页面从未被转发。webRequest文档说,“仅用作对onBeforeRequest事件的响应。”关于redirectUrl属性,这可能是罪魁祸首

    如何使用从响应头和Chrome webRequest模块接收的数据执行此类转发?

    方法

    • 允许取消或重定向请求
    • ,允许取消请求或修改标头
    • 允许提供\修改身份验证凭据
    所以,我们的想法是存储onHeadersReceived事件中的辅助URL,并触发一个事件,再次触发onBeforeRequest事件,这有助于重定向

    示例演示 以下未经测试:)演示阻止所有URL并将其重定向到收到辅助URL后,您可以进一步自定义它

    工具书类
    manifest.json
    确保所有权限都可用,并使用扩展名注册后台页面

    {
      "name": "Hanlder for Navigation",
      "description": "http://stackoverflow.com/questions/16928912/url-forwarding-using-chrome-webrequest-after-response-is-received",
      "version": "1",
      "manifest_version": 2,
      "background": {
        "scripts": ["background.js"]
      },
      "permissions":["https://www.facebook.com/*","webRequest","webRequestBlocking","tabs"]
    }
    
    background.js
    此代码阻止所有指向的URL请求并将其重定向到

    输出

    所有要重定向到的请求。

    此方法有点缺陷,因为它会为所有请求(包括帧和图像/样式表/脚本/…)重新加载整个选项卡。是的,通过设置从选项卡上的回调传递的选项卡ID,可以稍微改进。reload()方法。我刚刚尝试了这个示例,但无法使其重定向。我在控制台中没有看到错误。有什么我可能遗漏的吗?好奇的是,你不能
    返回{redirectUrl:“http://www.google.co.in/“/*重定向URL*/}来自onHeadersReceived,而不是强制使用tab.reload?我使用@GregDomjan方法,效果很好。无需为
    onBeforeRequest
    事件重新加载和添加另一个侦听器。
    onHeadersReceived
    中的
    重定向URL
    已在请求。请把这一问题列为明星!
    var _redirectURL = "";
    // Register an event listener which 
    //traces all requests before being fired
    chrome.webRequest.onBeforeRequest.addListener(function (details) {
        if (_redirectURL != "") {
            return {
                redirectUrl: "http://www.google.co.in/" /*Redirection URL*/
            };
        }
    }, {
        urls: ["*://www.facebook.com/*"] /* List of URL's */ * *
    }, ["blocking"]); // Block intercepted requests until this handler has finished
    chrome.webRequest.onHeadersReceived.addListener(function (details) {
        if (_redirectURL == "") {
            var secondaryURL = extractSecondaryURL(details);
            _redirectUrl = secondaryURL;
            chrome.tabs.reload();
        }
    }, {
        urls: ["http://*/*", "https://*/*"]
    }, ["blocking", "responseHeaders"]);