1

我试图创建一个Chrome扩展程序,该扩展程序利用Chrome的webRequest模块执行重定向到从最初访问的URL获取的URL。为此,我只想使用Chrome的webRequest函数(例如,onBeforeSendHeaders,onHeadersReceived),而不是简单地使用获取的URL执行对$ .ajax()的调用。所希望的功能是:收到回复后使用Chrome浏览器网址转发网址

  1. 用户在地址栏中输入URL
  2. 的请求是由与二次URL被从HTTP响应
  3. 萃取chrome.webRequest.onHeadersReceived处理程序使用用户重定向到该二次URL阻塞响应的redirectUrl属性。

我在完成这个尝试是:

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模块接收的数据执行此类转发?

+0

“onHeadersReceived”中的'redirectUrl'已请求https://code.google.com/p/chromium/issues/detail?id=280464。请明星问题! –

回答

2

web request API方法

所以,想法是存储来自onHeadersReceived事件的辅助URL并触发一个事件,该事件再次触发onBeforeRequest事件,这有助于重定向。

示例演示

下面未经测试的:)示范阻止所有Facebook的URL以及在接收到辅助URL其重定向到Google,您可以进一步自定义它。

参考

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请求Facebook,并将其重定向到Google

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"]); 

Output

所有请求(多个)Facebook被重定向到Google

+2

此方法存在一些小缺陷,因为它会为所有请求重新加载整个选项卡(包括** frames **和images/stylesheets/scripts/...中的请求)。 –

+0

是的,这可以通过设置从tabs.reload()方法回调的tabID稍微改进。 – ncla

+4

我只是试过这个例子,但我不能让它重定向。我在控制台中看到没有错误。有什么我可能会失踪? – user1513388