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