如何在Javascript中手动设置REFERER标头?

时间:2012-03-06 09:00:53

标签: javascript

我想设置网页的Referer标题。目前它显示“xyz”,我想将其设置为“abc”。

使用javascript:alert(document.referer)

查看了引用者

8 个答案:

答案 0 :(得分:33)

您可以在文档对象上使用Object.defineProperty作为referrer属性:

Object.defineProperty(document, "referrer", {get : function(){ return "my new referrer"; }});

不幸的是,这不适用于任何版本的safari< = 5,Firefox< 4,Chrome< 5和Internet Explorer< 9因为它不允许在dom对象上使用defineProperty。

答案 1 :(得分:26)

您无法手动设置Referer标头,但可以使用location.hrefreferer标头设置为href中使用的链接,但会导致重新加载页面。

答案 2 :(得分:17)

这适用于Chrome,Firefox,在Safari中无效:(尚未在其他浏览器中测试过

        delete window.document.referrer;
        window.document.__defineGetter__('referrer', function () {
            return "yoururl.com";
        });

在这里看到https://gist.github.com/papoms/3481673

此致

测试用例:https://jsfiddle.net/bez3w4ko/(因此您可以轻松测试多个浏览器),这是iframes的测试https://jsfiddle.net/2vbfpjp1/1/

答案 3 :(得分:2)

以上解决方案对我不起作用,我尝试过以下操作,并且它适用于所有浏览器。

只是做了一个虚假的ajax调用,它会进入referer标题。

var request;
if (window.XMLHttpRequest) { // Mozilla, Safari, ...
    request = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE
    try {
        request = new ActiveXObject('Msxml2.XMLHTTP');
    } catch (e) {
        try {
            request = new ActiveXObject('Microsoft.XMLHTTP');
        } catch (e) {}
    }
}
request.open("GET", url, true);
request.send();

答案 4 :(得分:2)

您无法更改REFERRER属性。你问的是欺骗请求。

以防万一您希望将referrer设置为直接打开网址或第一次{http referrer = null}然后重新加载页面

location.reload();

答案 5 :(得分:2)

我认为了解为什么不能更改referer标头可能会帮助人们阅读此问题。

在此页面上:https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name

通过该链接:

  

禁止的标头名称是任何无法以编程方式修改的HTTP标头的名称...

     

禁止修改此类标头,因为用户代理保留对标头的完全控制权。

     

禁止的标头名称...是以下名称之一:

     

...

     

推荐人

     

...

答案 6 :(得分:1)

如果要更改将在用户单击锚点或iframe打开时将发送到服务器的referer(url)标头,您可以在没有任何黑客攻击的情况下执行此操作。只需执行history.replaceState,您将更改将显示在浏览器栏中的URL以及将发送到服务器的referer。

答案 7 :(得分:0)

您可以使用Web Request API更改HTTP标头中的referrer值。

它需要一个后台js脚本才能使用它。 您可以使用 onBeforeSendHeaders ,因为它会在发送请求之前修改标头。

您的代码将是这样的:

    chrome.webRequest.onBeforeSendHeaders.addEventListener(function(details){
    var newRef = "http://new-referer/path";
    var hasRef = false;
    for(var n in details.requestHeaders){
        hasRef = details.requestHeaders[n].name == "Referer";
        if(hasRef){
            details.requestHeaders[n].value = newRef;
         break;
        }
    }
    if(!hasRef){
        details.requestHeaders.push({name:"Referer",value:newRef});
    }
    return {requestHeaders:details.requestHeaders};
},
{
    urls:["http://target/*"]
},
[
    "requestHeaders",
    "blocking"
]);

urls :它充当请求过滤器,仅针对某些请求调用侦听器。

欲了解更多信息: https://developer.chrome.com/extensions/webRequest