2017-10-21 77 views
1

Je travaille sur une extension Chrome en utilisant l'API JavaScript que je suis en train de rediriger l'URL lorsque ses matchs avec motif d'URL WebRequestChrome.webrequest.onBeforeRequest qui se fait appeler plusieurs fois

how chrome.webrequest.onebforerequest calling itsself multiple times

backgorund.js

 chrome.webRequest.onBeforeRequest.addListener(
      function(details) { 
       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} 
       } 

      }, 
      { 
       //setting url which we gonna match during first load 
       urls: [ 
        "*://answerme.com/questions/*", 
        "*://www.answerme.com/questions/*" 
       ] 
      }, 
      ["blocking"] 
     ); 

manifest.json

{ 
    "name": "Demo", 
    "description": "Demo", 
    "version": "0.1", 
    "manifest_version": 2, 
    "browser_action": { 
     "default_icon": "logo.png", 
     "default_popup": "window.html" 
    }, 
    "background": { 
     "scripts": ["background.js"] 
    }, 
    "permissions": [ 
     "activeTab", "tabs", "webRequest", 
     "*://answerme.com/questions/*", 
     "*://www.answerme.com/questions/*" 
     "webRequestBlocking", "storage" 
    ], 
    "icons": { 
     "16": "logo.png", 
     "128": "logo.png" 
    } 
} 

Problème: modèle url Même qui est en cours de vérification sur WebRequest qui est l'API ouput url a "www.answerme.com/quetion/78878 # 787878" et WebRequest url a "www.answerme.com/quetion/SearchQuery »

Dans ce cas, quand nous www.answerme.com/questions/searchquery la page sera redirigé vers la http://www.answerme.com/questions/7847859#748555, mais le problème est: le modèle que j'utiliser pour vérifier l'URL a * pour indiquer l'URL peut commencer par une protocole et ses premiers attributs commencent par quetions. Cela correspond à l'URL de redirection, http://www.answerme.com/questions/7847859#7848488, de sorte que cela devient interbloqué (redirigé à plusieurs reprises). Je reçois à nouveau la même requête de modèle d'URL (redirect url= www.asswerme.com/quetion/7878#7878 and webrequest url on manifest file has www.asswerme.com/quetion/*), donc j'ai décidé de vérifier que l'URL ne se termine pas par un nombre (manifeste de webrequest), de sorte que je puisse facilement les rediriger vers http://www.answerme.com/questions/7847859#14524 sans aucune ambiguïté.

+0

S'il vous plaît [modifier] votre question à clarifier. Veuillez spécifier * exactement * les URL que vous tentez de rediriger. Par exemple, voulez-vous rediriger les URL ** all ** '*: // *. Example.com/add/*' à l'exception de 'http: // www.example.com/add/7847859' à' http:// www.example.com/add/7847859'? Si c'est le cas, il suffit de tester l'URL pour voir si elle contient: 'if (details.url.indexOf ('http://www.example.com/add/7847859')! == 0) {return {redirectUrl: 'http://www.example.com/add/7847859'};} ' – Makyen

+0

oui .. je veux que l'url se termine par numéro # numéro 121454 # 25544 parce que chaque fois que je reçois une réponse d'api je reçois cette URL dans cet exemple de format .com/add/4545454 # 44555 donc je veux exactement le même motif –

+0

J'ai mis à jour la question –

Répondre

0

Vous pouvez utiliser RegExp pour vérifier si details.url se termine avec seulement des caractères numériques

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"} 
} 
+0

mais urls ["*: //example.com/add/*"] dit que si sa correspondance avec n'importe quelle URL qui commence par ajouter, il redirigera..sur cette solution à nouveau url sera dans la boucle parce que "http: //www.example.com/add/7847859 "a ajouter ... donc je veux l'expression régulière des urls pour cela [" *: //example.com/add/* "] comment pouvons-nous le faire? –

+0

@UmeshShende _ "dit que si sa correspondance avec une URL qui commence par ajouter, elle redirigera." _ La redirection ne se produit-elle pas réellement dans 'return {redirectUrl:" http://www.example.com/add/7847859 " } '? – guest271314

+0

ont mis à jour les quetions j'ai essayé avec .. mais je pense qu'il ne détecte pas la fin avec le numéro –

0

je suis la solution définir redirectAnswerUrl=""; et vérifier avec condition si redirectAnswerUrl=="" aller à l'intérieur d'autre rediriger

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