8

我正在尝试将“Referer”-HTTP-Header 添加到我的 Chrome 扩展程序中的某些 AJAX 请求。您不能直接在 AJAX 请求中更改它,所以我尝试使用webRequest api更改它:

chrome.webRequest.onBeforeSendHeaders.addListener(function(data) {
    console.log("onBeforeSendHeaders fired");
    var xdata=data.requestHeaders;
    xdata.push({
        "name":"Referer",
        "value": "http://the.new/referrer"
    })
    return {requestHeaders: xdata};
}, { //Filter
    urls: ["<all_urls>"], //For testing purposes
    types: ["xmlhttprequest"]
},["requestHeaders","blocking"]);

但这不适用于我的扩展程序中的 AJAX 请求。它只在其他 AJAX 请求上触发事件,而不是在我的扩展中完成的那些。
另一个奇怪的事情是,当没有设置“阻塞”标志时一切正常,但是我无法更改标题。

有谁知道解决这个问题的方法(或实现我目标的另一种方法:更改站点请求的“引用者”并检索内容)

谢谢 :)

4

5 回答 5

5

这是一个适用于所有情况的工作版本(当引用标头已设置或尚未设置时。)

var requestFilter = {
    urls: ["<all_urls>"]
},

extraInfoSpec = ['requestHeaders', 'blocking'],
handler = function(details) {

var isRefererSet = false;
var headers = details.requestHeaders,
    blockingResponse = {};

for (var i = 0, l = headers.length; i < l; ++i) {
    if (headers[i].name == 'Referer') {
        headers[i].value = "http://your-url.com/";
        isRefererSet = true;
        break;
    }
}

if (!isRefererSet) {
    headers.push({
        name: "Referer",
        value: "http://your-url.com/"
    });
}

blockingResponse.requestHeaders = headers;
return blockingResponse;
};

chrome.webRequest.onBeforeSendHeaders.addListener(handler, requestFilter, extraInfoSpec);

不要忘记将以下所有权限添加到您的清单中:

"permissions": [  "webRequest", "webRequestBlocking", "<all_urls>" ]
于 2014-09-27T03:55:08.837 回答
3

当您没有阻塞请求时,您无法设置 Referrer 标头的原因是该请求可能已经发出 - 您收到异步通知,并且无法更改有关请求的任何内容。

要更改标题,我使用以下代码:

function mod_headers(header_array,p_name,p_value) {
     var did_set = false;                                                                                      
     for(var i in header_array) {                                                                                                   
         var header = header_array[i];                                                                                              
         var name = header.name;                                                                                                    
         var value = header.value;                                                                                                  

         // If the header is already present, change it:
         if(name == p_name) {
             header.value = p_value;
             did_set = true;
         }                                                                                                         
     }
     // if it is not, add it:
     if(!did_set) { header_array.push( { name : p_name , value : p_value } ); }                                                                                                                       
 }
于 2012-07-22T18:11:42.267 回答
1

使用支持 ES6 的 Chrome,修改请求标头可以这样完成:

chrome.webRequest.onBeforeSendHeaders.addListener(
  details => {
    details.requestHeaders = details.requestHeaders.filter(rh => rh.name !== 'Referer');
    details.requestHeaders.push({name: 'Referer', value: 'http://the.new/referrer'});
    return {requestHeaders: details.requestHeaders};
  },
  {urls: ['<all_urls>']},
  ['blocking', 'requestHeaders'],
);
于 2020-03-13T10:33:04.257 回答
0

它不工作。请参阅http://code.google.com/p/chromium/issues/detail?id=132731上的详细信息

于 2012-07-22T11:49:00.220 回答
-1
chrome.webRequest.onBeforeSendHeaders.addListener(function(details) {
     console.log(details);
},{urls: ["<all_urls>"]});
于 2016-11-28T19:20:30.923 回答