OnBeforeRequest URL redirect in Firefox Addon (Conversion from Chrome Extension)

时间:2016-03-04 18:10:26

标签: javascript google-chrome-extension url-redirection firefox-webextensions

I want to convert a Chrome extension of mine to Firefox. So far so good, except I had an url redirect in webRequest.onBeforeRequest in the Chrome extension, which is not allowed in Firefox WebExtensions.

Now I am unsure how to implement this in Firefox.
In the Chrome background.js it looked something like this:

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

1 个答案:

答案 0 :(得分:3)

您引用WebExtensions docs

  

请求可以是:

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

...

     

onBeforeRequestonHeadersReceived不允许重定向,但onBeforeSendHeaders允许重定向。

嗯,这很好地解释了情况。您的选择是:

  1. 等到WebExtensions获得对webRequest的更好支持。
  2. 编辑(2018年12月):现在确实可以。引用the documentation

      

    在其中一些事件中,您可以修改请求。具体来说,您可以:

         
        
    • 取消请求:      
          
      • onBeforeRequest
      •   
      • onBeforeSendHeaders
      •   
      • onAuthRequired
      •   
    •   
    • 将请求重定向到:      
          
      • onBeforeRequest
      •   
      • onHeadersReceived
      •   
    •   
         

    [...]

    1. 取消,而不是重定向请求,如果完全没有连接就绝对必要。

    2. 重新定位onBeforeSendHeaders。考虑到您只检查URL以及该事件中可用的URL,除了在重定向之前已经建立TCP连接之外,它不应该有所不同。

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

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

      通常,如果您需要检查先前事件中可用的内容并在以后对其执行操作,则可以通过保存onBeforeRequest并稍后重定向该请求来标记requestId中的请求onBeforeSendHeaders中的请求ID。不幸的是,文档声明也不支持requestId