我想创建一个可以使用XMLHttpRequest
发送AJAX调用的Chrome扩展程序。我向其发送请求的网站不是我的。
当网站获得AJAX呼叫时,它会检查请求的Referer
标头。如果我从后台页面(Chrome扩展程序)发送AJAX,则不会发送Referer
标头,并且请求被拒绝。
如何更改背景页面中的Referer
标题?
答案 0 :(得分:3)
您应该能够使用webRequest
API拦截您自己的请求并修改请求标头。
具体来说,以阻止方式收听chrome.webRequest.onBeforeSendHeaders
,编辑标题对象,然后将其返回到覆盖标题。
并非所有标头都可以通过这种方式修改,但Referer
可以。
答案 1 :(得分:3)
如Xan的回答所述,您需要使用webRequest API。由于我喜欢答案中的最小例子,所以这里有一个:
manifest.json权限需要包含:
"permissions": [
"*://target.site/",
"webRequest",
"webRequestBlocking"
]
用于修改包含任意引用的请求的js代码:
callback = function(details) {
details.requestHeaders.push({
name: 'Referer',
value: 'http://your.arbitrary.referer'
});
return {
requestHeaders: details.requestHeaders
};
};
filter = { urls: ["*://target.site/target.html"] };
opts = ['blocking', 'requestHeaders']
chrome.webRequest.onBeforeSendHeaders.addListener(callback, filter, opts);
每当浏览器立即向*://target.site/target.html
发出请求时,引用者将被设置为http://your.arbitrary.referer
。这对于用户完成的请求(通过单击链接或在执行AJAX请求的站点上)以及您自己的扩展的AJAX请求生效。
答案 2 :(得分:0)
W3规范明确禁止更改' Referer' -header。当您尝试手动设置Referer时,请求将被拒绝。
来源:http://www.w3.org/TR/XMLHttpRequest/#dom-xmlhttprequest-setrequestheader