2014-11-03 71 views
1

只有當標題不包含任何推薦人時,我必須從www.example.com重定向到xyz.example.com。我已經寫了這個代碼:重定向那些沒有任何推薦人網址的網址

chrome.webRequest.onHeadersReceived.addListener(
    function(details) { 
    var match = details.url.match(/^(http|https):\/\/www.example.com\/([\S\s]*)/); 
    console.log(details); 
    return {redirectUrl: match[1] + "://xyz.example.com/" + match[2]}; 
    }, 
    {urls: ["*://www.example.com/*"]}, 
    ["responseHeaders", "blocking"] 
); 

但「onHeadersReceived」不包含任何指引信息。所以我不能根據引用者信息進一步編寫我的邏輯。有一個API「onBeforeSendHeaders」包含referrer信息但它不能重定向。你能建議任何解決方案,可以給予引薦信息和重定向。以下是所有可用API的鏈接:Chrome API's link

+1

這些都是_response_聽衆和引用是_request_頭。 – Xan 2014-11-03 18:43:48

+0

不幸的是,你似乎只能在'onBeforeSendHeaders'上得到這個結果,但是現在用'webRequest'重定向請求已經太遲了。 – Xan 2014-11-03 18:46:48

+0

是的,我知道,這將是「onBeforeSendHeaders」的情況下requestHeader,但它不能重定向。 「如何重定向」是問題 – 2014-11-03 18:49:03

回答

1

正如RobW指出的那樣,可以在onHeadersReceived階段重定向請求。

因此,該計劃:

  1. 確定要在onBeforeSendHeaders階段重定向哪個請求。
  2. 保存請求ID。
  3. 收聽onHeadersReceived事件。
  4. 將請求ID與保存的ID進行比較。
  5. 如果需要,重定向。

所以:

var requestsToRedirect = new Object(); 

chrome.webRequest.onBeforeSendHeaders.addListener(
    function(details) { 
    for (var i = 0; i < details.requestHeaders.length; i++) { 
     if (details.requestHeaders[i].name === 'Referer') { 
     requestsToRedirect[details.requestId] = true; 
     return; 
     } 
    } 
    }, 
    {urls: ["*://www.example.com/*"]}, 
    ["requestHeaders"] 
); 

chrome.webRequest.onHeadersReceived.addListener(
    function(details) { 
    if(requestsToRedirect[details.requestId]) { 
     delete requestsToRedirect[details.requestId]; 
     var match = details.url.match(/^(http|https):\/\/www.example.com\/(.*)/); 
     return {redirectUrl: match[1] + "://xyz.example.com/" + match[2]}; 
    } 
    }, 
    {urls: ["*://www.example.com/*"]}, 
    ["blocking"] 
); 

chrome.webRequest.onErrorOccurred.addListener(
    function(details) { 
    // Cleanup in case we don't reach onHeadersReceived 
    delete requestsToRedirect[details.requestId]; 
    }, 
    {urls: ["*://www.example.com/*"]} 
); 
+0

只是一個修正它應該是[「responseHeaders」,「blocking」]而不是[「blocking」] 非常感謝:)現在完全正常工作! – 2014-11-03 19:52:01

+0

@sumitkumar我不認爲你需要回應標題:你沒有看到他們中的任何一個。 – Xan 2014-11-03 19:53:05

+1

1.不需要'onBeforeSendHeaders'上的'blocking',因爲你沒有修改請求2.將'delete'移到'if'塊之外,並且將'delete'邏輯添加到'chrome.webRequest.onErrorOccurred ',否則你可能會得到一些過時的條目。 – 2014-11-03 20:20:03