我正在开发一个chrome扩展,在部分扩展中,我需要检测重定向并询问用户他/她是否希望继续。我尝试使用chrome的webRequest API执行此操作,但它似乎无法正常工作,即使我确定我的语法是正确的。以下是相关代码:
chrome.webRequest.onBeforeRedirect.addListener(function (details) {
if(details.frameId == 0){
if (confirm("This link is a redirect. Do you want to continue?")){
/* do nothing and let them redirect */
}
else {
/* stop the redirect from happening */
return {cancel: true};
}
}
}, {urls: ["<all_urls>"], types: ["main_frame"]}, ["blocking"]);
为什么该方法无法正常阻止?
答案 0 :(得分:3)
根据official guide,您不能取消重定向
onBeforeRedirect
即将执行重定向时触发。重定向可以由HTTP响应代码或扩展名触发。此事件是信息性的并且是异步处理的。 它不允许您修改或取消请求。
答案 1 :(得分:1)
Haibara完全正确,onBeforeRedirect
纯粹是信息性的,但让我补充一点。
onBeforeRequest
和onBeforeSendHeaders
是唯一可以发生的事件 - 即取消只有在实际发出请求之前才可能。这是一个定义&#34;取消&#34;的问题,因为请求已经出来了。
请注意,您可以将onHeadersReceived
用于您的目的 - 该事件中提供的标头是用于重定向请求的标头,您可以通过重定向(在此时允许)到您自己的扩展名来覆盖它页。
但是,我还必须说你可能在这里追逐错误的嫌疑人。据我所知webRequest
,这只会抓住HTTP 3** redirects;任何其他重定向方法(例如更改window.location
)都意味着此特定网络请求成功,然后生成后续导航,该导航对webRequest
透明。
HTTP 3 **重定向最常用于将http重写为https或将URL修改为规范的良性目的。