1

我想将我的Chrome扩展程序转换为Firefox。到目前为止,除了我在Chrome扩展中的webRequest.onBeforeRequest中有一个url重定向,它是not allowed in Firefox WebExtensionsOnBeforeRequest URL重定向Firefox的插件(从Chrome扩展名转换)

现在我不确定如何在Firefox中实现此功能。
在Chrome background.js它看起来是这样的:

chrome.webRequest.onBeforeRequest.addListener(
    function(details) { 
    console.log('onBeforeRequest'); 

    var returnuri; 
    returnuri = details.url; 
    if ((details.url.indexOf("/malicious/") > -1) || (details.url.indexOf("/bad/") > -1)){ 
     //I want to redirect to safe content 
     returnuri = details.url + (/\&tag=/.test(details.url) ? "" : '/safe/'); 
    }else{ 
     returnuri = details.url; 
    } 
    return {redirectUrl: returnuri}; 
    }, 
    { 
    urls: [ 
     "*://malicious.com/*" 
    ], 
    types: ["main_frame"] 
    }, 
    ["blocking"] 
); 
+0

什么让你觉得这是不允许在Firefox插件? – the8472

+0

https://developer.mozilla.org/de/Add-ons/WebExtensions/Chrome_incompatibilities “重定向不允许在onBeforeRequest或onHeadersReceived中,但在onBeforeSendHeaders中允许。” – user1032620

回答

1

你举WebExtensions docs

请求可以是:

  • 取消仅在onBeforeRequest
  • 修改/重定向只在onBeforeSendHeaders

...

重定向不onBeforeRequestonHeadersReceived允许的,但不允许在onBeforeSendHeaders

那么,这说明情况相当不错。您的选项有:

  1. 等到WebExtensions获得对webRequest的更好支持。

  2. 如果完全没有必要完成连接,则取消并不重定向请求。

  3. 改为改为onBeforeSendHeaders。考虑到你只检查URL并且在该事件中可用,除了在重定向之前TCP连接可能已经建立之外,它应该没有什么不同。

    请注意,相同的代码在Chrome中不起作用 - 它不希望在此请求中重定向。

    正如你所提到的,与Chrome不同,重定向到同一个URL会产生一个循环(因为此时请求需要从头开始重新制作)。

    一般来说,如果你需要检查可用的东西在前面的事件,后来采取行动,你便可以通过标志保存其requestId后来重定向相​​同的请求ID在onBeforeSendHeadersonBeforeRequest请求。不幸的是,文档指出requestId也不支持。

+1

嘿,谢谢你的回答。我试图这样做,但我不确定如何解决运行成循环的问题。当我在onBeforeSendHeaders中重定向时,它会使用新的uri触发onBeforeRequest,然后再次触发onBeforeSendHeaders,等等。 我只能想象检查安全网址以及只有重定向,如果没有检测到这是不容易的,它是相当动态的,并不像上面张贴简单。任何其他优雅的解决方案,我可以如何避免几次重新触发sendHeaders事件? – user1032620

+0

但新的'onBeforeSendHeaders'将会有一个“好”的URL。如果URL确实需要更改,则需要更改逻辑以仅返回阻止响应。当然'return {redirectUrl:request.url}'是循环的_asking_。 – Xan

+0

是的,你是对的。将重新编程以适应它。感谢您的意见。帮助我清除阻塞:)现在支持 – user1032620