JavaScript window.location 未在请求标头中设置引用者

Posted

技术标签:

【中文标题】JavaScript window.location 未在请求标头中设置引用者【英文标题】:JavaScript window.location does not set referer in the request header 【发布时间】:2011-06-13 07:58:23 【问题描述】:

我了解在请求标头中依赖Referer 是不对的。但我的问题是,如果我使用window.location,为什么 IE 不会将 Referer 设置为请求标头?有什么想法或解决方法吗?

这不会在Request header中设置Referer

function load1() 
   window.location = "https://" + serverURL + "/path/folder/page.aspx";


<a href="javascript:load1()">Link 1</a>

虽然设置

<a href="https://hardcode.server.url/path/folder/page.aspx">Link 1</a>

【问题讨论】:

你试过go()、Navigate()还是href? window.location 不导航到页面,而只是重定向到那里。 【参考方案1】:

您的帖子标题显示您希望使用 JavaScript 以编程方式更改当前页面,但仍提供 HTTP 引用(据我了解,使用 &lt;a&gt; 标记仅用于测试用例)。

您需要注意跨浏览器问题:

在以下浏览器下更改window.location.href时会设置HTTP referrer header(HTTP-Referer): MSIE 9(但可能是 9 以上的任何版本) Firefox(至少 3.0、3.5、4.0、5.0,但很可能是所有版本) Chrome(至少 9 个,但很可能是所有版本) Safari(至少 5 个,但很可能是所有版本) Opera(至少 11 个,但很可能是所有版本) MSIE(至少 6、7、8):在更改 window.location.href设置引用(这就是为什么一些伪解决方案基于 myLink.click()Firefox(至少 3.0、3.5、4.0)click 函数不存在(这就是为什么基于 myLink.click() 的伪解决方案不起作用的原因) Firefox 5click 函数在 Firefox 5 下存在,但不存在 改变窗口位置,所以所有依赖的方法 myLink.click() 方法的存在将不起作用。调用 myLink.onclick()myLink.onClick() 会引发错误(“onclick 不是函数”),因此 solutions based on these calls 将不起作用。

为了管理这些跨浏览器问题,我使用了以下方法:

function navigateToUrl(url) 
    var f = document.createElement("FORM");
    f.action = url;

    var indexQM = url.indexOf("?");
    if (indexQM>=0) 
        // the URL has parameters => convert them to hidden form inputs
        var params = url.substring(indexQM+1).split("&");
        for (var i=0; i<params.length; i++) 
            var keyValuePair = params[i].split("=");
            var input = document.createElement("INPUT");
            input.type="hidden";
            input.name  = keyValuePair[0];
            input.value = keyValuePair[1];
            f.appendChild(input);
        
    

    document.body.appendChild(f);
    f.submit();


navigateToUrl("http://foo.com/bar");

此解决方案适用于上面列出的所有浏览器风格和版本。它的优点是简单、多浏览器和易于理解。 请注意,这尚未在 HTTPS 下进行测试。

【讨论】:

这很好用,除非你想使用 method="GET" 并且在你的 url 中有 url 参数。 @Cixate : 对于 URL 参数为真(我编辑了代码),但我不理解表单方法的参数,因为默认的表单方法是 GET。 对不起,并不是暗示您需要标签中的method=GET,只是说如果表单使用 GET 方法,您不能在 URL 中使用参数。但是您的隐藏参数修复效果很好。 这可能很明显,(除了我之外的所有人)但是如果你在页面加载之前运行这个脚本你会得到 TypeError: document.body is null appendChild。所以在页面加载后运行它:)【参考方案2】:

设置window.location 与点击该页面上的链接不同。当用户在浏览器的地址栏中输入 URL 时,它会开始对该页面的新请求。

我确实设法找到了解决方法:

function goTo(url)

    var a = document.createElement("a");
    if(!a.click) //for IE
    
         window.location = url;
         return;
    
    a.setAttribute("href", url);
    a.style.display = "none";
    document.body.appendChild(a);
    a.click();

它在页面上创建一个链接并模拟点击。结果是window.location 发生了变化,并填充了引荐来源网址。

http://ianso.blogspot.com/2006/01/referer-header-not-set-on-http.html

【讨论】:

你不需要 jQuery。 $("body").appendChild(a) 可以替换为 document.body.appendChild(a); 非常感谢您这样做。我以为你是个没心没肺的机器人。 :) 看到 Firefox 5 为 a.click 返回 true 但在执行 a.click() 时没有导航到 href 的证据。 “不会导致 A 元素启动导航,就像收到真正的鼠标点击一样”:developer.mozilla.org/en/DOM/element.click 在 Windows 7 上运行的 Safari 5.0 上,这会导致以下错误:TypeError: 'undefined' is not a function (evaluating 'a.click()')【参考方案3】:

我没有足够的分数来评论 Evan 的回答来建议更正,所以我所能做的就是在此处发布更正。简而言之,document.createElement(a) 缺少引号,应改为document.createElement("a")。这应该也可以解决 Kevin 对 FF5 的担忧。

我写的整个函数:

function goTo(url)

    var a = document.createElement("a");
    if (a.click)
    
        // HTML5 browsers and IE support click() on <a>, early FF does not.
        a.setAttribute("href", url);
        a.style.display = "none";
        document.body.appendChild(a);
        a.click();
     else 
        // Early FF can, however, use this usual method
        // where IE cannot with secure links.
        window.location = url;
    

这适用于我们使用 IE7、IE8、FF3、FF7 和 Chrome 的 HTTPS 环境。所以我想它也适用于FF5。如果没有此解决方法,我们在尝试设置 window.location 时会在 IE7 和 IE8 中出现 403 错误。至于沙乐问IE为什么要这么做,我只能猜测他们认为太不安全了。我在 IE 中遇到了类似的 window.open 问题,我也必须解决这个问题。

【讨论】:

【参考方案4】:

Is it possible to trigger a link's (or any element's) click event through JavaScript? 使用 createEvent/dispatchEvent 或 createEventObject/fireEvent 解决方案。

【讨论】:

【参考方案5】:

是的,你的也可以,但最终还是做了:

<a href="#" id="linkOne">Link 1</a>

<script type="text/javascript">
   document.getElementById("linkOne").href = "https://" + serverURL + "/path/folder/page.aspx";
</script>

【讨论】:

所有这些都是设置锚标签的href。除非用户单击该链接,否则它不会执行任何操作。

以上是关于JavaScript window.location 未在请求标头中设置引用者的主要内容,如果未能解决你的问题,请参考以下文章

使用 JavaScript 检查链接变量

Arison [JS]window.location获取url各项参数详解

window.location.href=window.location.href 和 window.location.reload() 的区别

页面重定向的几种方法

JS之BOM的几个对象

js获取当前页面信息