【问题标题】:How to manually set REFERER header in Javascript?如何在 Javascript 中手动设置 REFERER 标头?
【发布时间】:2012-03-23 17:55:40
【问题描述】:

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

使用javascript:alert(document.referer)查看的referer

【问题讨论】:

  • 之前有人问过这个问题:stackoverflow.com/questions/220231/…
  • @TiesonT。实际上,这个问题是关于访问 HTTP 标头,而不是覆盖 Referer 标头。
  • @MathiasBynens 很公平,但是您无法更改无法访问的内容,对吧? :)
  • 你不能,document.referrer 是一个只读属性,它的值只有在选择链接时才会改变。如果此选择的链接位于安全站点上,则会分配一个空字符串。
  • @T.J.Crowder 两个原因:) 有时忘记接受答案,有时我得不到可接受的答案

标签: javascript


【解决方案1】:

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

【讨论】:

  • 感谢它改变了引用者,但它改变了 selenium 服务器的 URL 所以我认为不可能改变引用者
  • @ABG 你有没有机会写更多关于你的答案是如何在代码中实现的?例如。一个简短的 javascript 截图或 HTML sn-p?
  • @jsmcrind 有点晚了,但是如果你只是做window.location.reload() 这将导致页面重新加载,如果你检查document.referrer 它应该等于当前页面而不是它可能有的任何内容以前。尝试在 jsfiddle 中创建一个测试用例,但由于网站的沙盒性质而失败。 (Though I did create a somewhat amusing recursive jsfiddle in the process.)
【解决方案2】:

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

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

不幸的是,这不适用于任何版本的 safari

【讨论】:

  • 也可以。尽管他的作品也比@casivaagustin 的回答更喜欢这个
  • 使用这种方法,我在 Safari 9 中遇到错误:“TypeError: Attempting to change the getter of an unconfigurable property.”
  • 如果你想在测试中改变它并且想在多个测试用例中重新定义referrer,使用`` Object.defineProperty(document, 'referrer', {configurable: true, get: () => 网址,}); ```
  • 它设置了对象属性,但没有在请求头中设置
  • 这里是菜鸟。这条线会进入 吗?是否要在 onload 或 document.ready 等事件中调用?
【解决方案3】:

这在 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/(这样您就可以轻松测试多个浏览器),这是一个使用 iframe 的测试https://jsfiddle.net/2vbfpjp1/1/

【讨论】:

  • 但是当用户尝试访问新站点时呢?例如,site1.com 上有一个链接将用户重定向到 site2.com
  • 不添加推荐域“yoururl.com”
  • @Brandito 没用,值变了,但是当你发送image之类的请求时,你会发现referrer还是旧的。
  • 我可以确认它在 Safari 13 中有效。但之后我不得不使用location.reload();
【解决方案4】:

上面的解决方案对我不起作用,我已经尝试过,它适用于所有浏览器。

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

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();

【讨论】:

  • 我应该如何尝试这个?您能提供我的步骤吗,因为我使用了很多方法来更改推荐标题但没有任何效果?
【解决方案5】:

您不能更改 REFERRER 属性。您的要求是欺骗请求。

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

location.reload();

【讨论】:

  • 这只会删除引荐来源网址。不添加自定义标题
  • 对。问题不在于添加自定义标题。
【解决方案6】:

您可以使用 Web 请求 API 更改 HTTP 标头中的引用者的值。

它需要一个后台 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

【讨论】:

  • 有更好的例子吗?我应该在哪里粘贴这个?
  • 您应该创建一个后台脚本并将其粘贴到该文件中。请务必将该文件作为后台脚本添加到您的清单中。
  • 如果您正在编写 chrome 扩展,此答案有效。 - 如果您的客户/用户接受安装它 - 或者如果您正在家里做一些事情供自己使用并准备安装自己的扩展。
【解决方案7】:

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

【讨论】:

【解决方案8】:

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

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

从那个链接:

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

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

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

...

推荐人

...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多