Javascript Chrome.webrequest.onBeforeRequest多次调用自身
我正在使用JavaScriptAPI开发一个Chrome扩展,在这个扩展中,当URL与WebRequestURL模式匹配时,我试图重定向URL backgorund.jsJavascript Chrome.webrequest.onBeforeRequest多次调用自身,javascript,url,google-chrome-extension,Javascript,Url,Google Chrome Extension,我正在使用JavaScriptAPI开发一个Chrome扩展,在这个扩展中,当URL与WebRequestURL模式匹配时,我试图重定向URL backgorund.js chrome.webRequest.onBeforeRequest.addListener( 功能(详情){ 变量主机=”https://api.answerme.com/2.2/questions/345797"; var x=新的XMLHttpRequest(); x、 打开('GET',host,false); x、
chrome.webRequest.onBeforeRequest.addListener(
功能(详情){
变量主机=”https://api.answerme.com/2.2/questions/345797";
var x=新的XMLHttpRequest();
x、 打开('GET',host,false);
x、 onload=函数(){
//此函数为我提供URL并将其存储到“redirectAnswerUrl”全局变量中(工作正常)
设置重定向到应答器(x.responseText);
};
x、 send();
//这是一个很好的输出:-www.answerme.com/quetion/78784#45545
警报(“重定向应答URL”+重定向应答URL);
如果(重定向应答URL!=“”){
//但此redirectAnswerUrl具有与输出和清单url相同的默认url模式
返回{redirectUrl:redirectAnswerUrl}
}
},
{
//设置第一次加载时要匹配的url
网址:[
“*://answerme.com/questions/*”,
“*://www.answerme.com/questions/*”
]
},
[“封锁”]
);
manifest.json
{
“名称”:“演示”,
“说明”:“演示”,
“版本”:“0.1”,
“清单版本”:2,
“浏览器操作”:{
“默认图标”:“logo.png”,
“默认弹出窗口”:“window.html”
},
“背景”:{
“脚本”:[“background.js”]
},
“权限”:[
“活动选项卡”、“选项卡”、“webRequest”,
“*://answerme.com/questions/*”,
“*://www.answerme.com/questions/*”
“webRequestBlocking”、“存储”
],
“图标”:{
“16”:“logo.png”,
“128”:“logo.png”
}
}
问题:在webrequest上检查的url模式与API输出url相同“www.answerme.com/quetion/78878#78787878”,而webrequest url具有“www.answerme.com/quetion/searchquery”
在这种情况下,当我们获得
www.answerme.com/questions/searchquery
时,页面将被重定向到http://www.answerme.com/questions/7847859#748555
,但问题是:我用来检查URL的模式有*
来指示URL可以以任何协议开头,其第一个属性以quetions
开头。这与重定向URL匹配,http://www.answerme.com/questions/7847859#7848488
,因此这会变成死锁(重复重定向)。我再次收到相同的URL模式请求(重定向URL=www.asswerme.com/quetion/7878#7878,清单文件上的WebRequestURL具有www.asswerme.com/quetion/*
),因此我决定检查URL是否以数字结尾(webrequest清单),这样我就可以轻松地将它们重定向到http://www.answerme.com/questions/7847859#14524
没有任何歧义。您可以使用RegExp
检查详细信息。url
仅以数字字符结尾
if (!/^\d+$/.test(details.url.split("/").pop())) {
// `details.url` does not end with only digits, do other stuff
} else {
return {redirectUrl: "http://www.example.com/add/7847859"}
}
我得到了解决方案define
redirectAnswerUrl=“”如果重定向应答URL==”
进入其他重定向,则使用条件检查
chrome.webRequest.onBeforeRequest.addListener(
function(details) {
if(redirectAnswerUrl==""){
var host="https://api.answerme.com/2.2/questions/345797";
var x = new XMLHttpRequest();
x.open('GET',host,false);
x.onload = function() {
// this function gives me URL and store into "redirectAnswerUrl" global variable (working fine)
setRedirectedToAnswer(x.responseText);
};
x.send();
//this working fine output:-www.answerme.com/quetion/78784#45545
alert("redirectAnswerUrl"+redirectAnswerUrl);
if(redirectAnswerUrl!=""){
//but this redirectAnswerUrl has same pattern of default urls that is above output and manifest url
return {redirectUrl: redirectAnswerUrl}
}else{
return {redirectUrl: details.url}
}
},
{
//setting url which we gonna match during first load
urls: [
"*://answerme.com/questions/*",
"*://www.answerme.com/questions/*"
]
},
["blocking"]
);
但是url[“://example.com/add/”]表示,如果它与任何以add开头的url匹配,它将重定向..按照此解决方案,url将再次处于循环中,因为“”有add…所以我想要此[“://example.com/add/”]的url正则表达式,我们如何做?@UmeshShende“表示如果它与任何以add开头的url匹配,它将重定向。”重定向是否实际发生在返回{redirectUrl:http://www.example.com/add/7847859“}
?已更新了我尝试使用的问题..但我认为它无法检测end with numberWhat doconsole.log(details.url)
log?如果块偶数url以www.example.com/add/784681这样的数字结尾,它就会进入内部。请澄清您的问题。请准确指定您试图重定向的url。例如,是否要重定向所有*://*。example.com/add/*
url,除了http://www.example.com/add/7847859
到<代码>http://www.example.com/add/7847859
?如果是,那么只需测试URL,看看它是否包含以下内容:If(details.URL.indexOf('http://www.example.com/add/7847859')!==0){返回{重定向URL:'http://www.example.com/add/7847859' };}
yes..我想要以数字结尾的url#数字121454#25544,因为每当我从api得到响应时,我都会得到这个url的格式example.com/add/4545454#44555,所以我想要完全相同的模式我已经更新了问题您的问题仍然不清楚。请确切地指定您想要重定向的内容和不想要重定向的内容(如果您的重定向URL之外有其他内容)。请给出多个示例。坦率地说,您没有明确定义这一点是您遇到问题的基础。还不清楚您是否遇到了其他重定向扩展所遇到的问题,即站点将重定向到另一个匹配页面,从而导致多阶段的循环s、 此外,如果您希望将每个请求重定向到这些匹配的URL,或者仅仅是页面导航到这些特定页面的结果(通常不太可能导致问题),那么您应该明确地做出选择。