我正在尝试在Chrome扩展程序中为某些AJAX请求添加“Referer”-HTTP-Header。 您无法在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请求中触发事件,而不是在我的扩展中完成的事件 另一个奇怪的事情是,当没有设置“阻塞”标志时,一切正常,但是我无法更改标题。
有没有人知道解决这个问题的方法(或实现我的目标的另一种方法:更改站点请求的“Referer”并检索内容)
谢谢:)
答案 0 :(得分:3)
这是一个适用于所有实例的工作版本(当已经设置了referer标头或尚未设置它时。)
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>" ]
答案 1 :(得分:2)
当您没有阻止请求时无法设置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 } ); }
}
答案 2 :(得分:0)
答案 3 :(得分:0)
在Chrome支持ES6的情况下,修改请求标头的操作可以像这样:
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'],
);
答案 4 :(得分:-1)
chrome.webRequest.onBeforeSendHeaders.addListener(function(details) {
console.log(details);
},{urls: ["<all_urls>"]});