JavaScript window.location不在请求标头中设置referer

时间:2011-01-21 18:11:21

标签: javascript html referrer

我理解在请求标头中依赖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>

5 个答案:

答案 0 :(得分:35)

您的帖子标题显示您想要使用JavaScript以编程方式更改当前页面,但仍然提供了HTTP引用(根据我的理解,使用<a>标记仅用于测试用例。)

您需要了解跨浏览器问题:

  • 在以下浏览器中更改window.location.href时设置HTTP引用标头(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()的伪解决方案不起作用的原因)< / LI>
  • Firefox 5 :Firefox 5下存在click功能,但没有 改变窗口位置,所以所有的方法都依赖于 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");

此解决方案适用于上面列出的所有浏览器风格和版本。它具有简单,多浏览器和易于理解的优点。 请注意,这尚未在HTTP S

下进行测试

答案 1 :(得分:18)

设置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

答案 2 :(得分:4)

我没有足够的评论来评论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;
    }
}

这适用于我们的HTTPS环境,包括IE7,IE8,FF3,FF7和Chrome。所以我想它也适用于FF5。如果没有这种解决方法,我们在尝试设置window.location时会在IE7和IE8中收到403错误。关于Sha Le关于为什么IE这样做的问题,我只能猜测他们认为它太不安全了。我在IE浏览器中遇到了类似的问题,我也必须解决这个问题。

答案 3 :(得分:0)

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

答案 4 :(得分:-3)

Yeap,你的工作也很好,但最终做了:

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

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