1

我正在開發一個擴展,用於按文件的內容類型阻止下載。這是後臺腳本的一部分,該處理頭接收:通過Chrome擴展按內容類型阻止下載

chrome.webRequest.onHeadersReceived.addListener(function(details) { 
    var headers = details.responseHeaders; 

    for(var i = 0, l = headers.length; i < l; ++i) { 
     if(headers[i].name == "Content-Type" && headers[i].value == "<some_type>") { 
      return {cancel: true}; 
     } 
    } 
}, {urls: ["<all_urls>"]}, ["responseHeaders", "blocking"]); 

我也得到頁面錯誤信息: message

所以我需要一些解決方案,以保持用戶以前的頁面上無需重新加載,以顯示這個錯誤頁面或者在顯示之後以某種方式從該服務頁面移回。

回答

1

如果您希望避免在基於內容類型的(i)框架中導航,那麼您的運氣不好 - 在這一點上無法防止頁面卸載。

如果你想阻止頂層框架導航,那麼就有希望了。您可以將頁面重定向到HTTP狀態碼204

chrome.webRequest.onHeadersReceived.addListener(function(details) { 
    // ... your code that checks whether the request should be blocked ... 

    if (details.frameId === 0) { // Top frame, yay! 
     var scheme = /^https/.test(details.url) ? "https" : "http"; 
     chrome.tabs.update(details.tabId, { 
      url: scheme + "://robwu.nl/204" 
     }); 
     return; 
    } 
    return {cancel: true}; 
}, { 
    urls: ["<all_urls>"], 
    types: ["main_frame", "sub_frame"] 
}, ["responseHeaders", "blocking"]); 

一旦issue 280464解決回覆的資源,也可以用以前的方法,以防止子卸載。

https://robwu.nl/204是我的網站的一部分。訪問此URL不記錄。對此條目的迴應將始終爲「204無內容」。

+0

Thx,它工作的很棒! – mmatviyiv

+0

@RobW給定的解決方案不能阻止下載,只使用「return」會導致下載開始。 –

+0

@adnankamili爲了解決這個問題,你可以將'content-type'頭部改爲不可下載的文本/純文本,添加'content-type-options:no-sniff'(以禁用MIME嗅探)。雖然老實說,這個答案是一個真正的黑客。如果你的意圖是取消一個請求,那麼你應該真的使用'{cancel:true}'。 –