我正在尝试创建一个Chrome扩展程序,该扩展程序利用Chrome的webRequest模块执行对从初始访问的URL获得的URL的重定向。为此,我只想利用Chrome的webRequest函数(例如onBeforeSendHeaders,onHeadersReceived),而不是简单地使用获得的URL调用$ .ajax()。所需的功能是:
用户在地址栏中输入URL
发出请求并从HTTP响应中提取辅助URL
chrome.webRequest.onHeadersReceived处理程序使用阻止响应的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模块接收的数据执行这种转发?
已通过code.google.com/p/chromium/issues/detail?id=280464请求了onHeadersReceived中的redirectUrl。 请为问题加注星标!
Web请求API方法
onBeforeRequest允许取消或重定向请求
onBeforeSendHeaders,onHeadersReceived允许取消请求或修改标头
onAuthRequired允许提供修改身份验证凭据。
因此,想法是存储onHeadersReceived事件中的辅助URL并触发一个chrome.tabs.reload()事件,该事件再次触发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。
此方法有一点缺陷,因为它会为所有请求(包括框架和图像/样式表/脚本/ ...中的请求)重新加载整个选项卡。
是的,可以通过在tabs.reload()方法上设置从回调传递的tabID来稍作改进。
我只是尝试了此示例,但无法将其重定向。 我在控制台中看不到任何错误。 我有什么想念的吗?
很好奇,您不能从onHeadersReceived return { redirectUrl:"http:www.google.co.in" *Redirection URL* };而不是强制执行tab.reload吗?