JavaScript window.location 没有在请求头中设置引用

IT技术 javascript html referrer
2021-03-13 22:26:32

我理解在请求标头中依赖 Referer 是不对的。但我的问题是,如果我使用 IE,为什么 IE 不将 Referer 设置为请求标头window.location任何想法或修复?

这不会在请求标头中设置 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个回答

您的帖子标题显示您想使用 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()不起作用的原因)
  • Firefox 5:该click功能在Firefox 5下存在但不改变窗口位置,因此所有依赖该方法存在的myLink.click()方法都不起作用。调用myLink.onclick()myLink.onClick()引发错误(“onclick 不是函数”),因此基于这些调用的解决方案将不起作用。

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

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下进行测试

这很有效,除非您想使用 method="GET" 并在您的 url 中包含 url 参数。
2021-05-04 22:26:32
@Cixate :URL 参数为真(我编辑了代码),但我不理解表单方法的参数,因为默认表单方法是 GET。
2021-05-11 22:26:32
抱歉,并不是暗示您需要method=GET标签中的 ,只是说如果表单使用 GET 方法,则您不能在 URL 中使用参数。但是您的隐藏参数修复效果很好。
2021-05-17 22:26:32
这可能是显而易见的(对除我之外的所有人)但如果您在页面加载之前运行此脚本,您将得到 TypeError: document.body is null appendChild。所以在页面加载后运行它:)
2021-05-18 22:26:32

设置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);
2021-04-21 22:26:32
在 Windows 7 上运行的 Safari 5.0 上,这会导致以下错误:TypeError: 'undefined' is not a function (evaluating 'a.click()').
2021-04-22 22:26:32
看到 Firefox 5 为 a.click 返回 true 但在执行 a.click() 时不会导航到 href 的证据。
2021-04-29 22:26:32
非常感谢您这样做。我以为你是一个无情的机器人。:)
2021-05-14 22:26:32
“不会导致 A 元素像接收到真正的鼠标点击一样启动导航”:developer.mozilla.org/en/DOM/element.click
2021-05-17 22:26:32

我没有足够的分数来评论埃文的回答以提出更正建议,所以我所能做的就是在此处发布更正。简而言之,document.createElement(a)缺少引号,应该document.createElement("a")改为。这也应该解决凯文对 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。如果没有这个变通办法,我们会在 IE7 和 IE8 中尝试设置 window.location 时出现 403 错误。对于沙乐关于IE为什么这样做的问题,我只能猜测他们认为它太不安全了。我在 IE 中的 window.open 也有类似的问题,我也必须解决这个问题。

是否可以通过 JavaScript 触发链接(或任何元素)的点击事件?使用 createEvent/dispatchEvent 或 createEventObject/fireEvent 解决方案。

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

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

<script type="text/javascript">
   document.getElementById("linkOne").href = "https://" + serverURL + "/path/folder/page.aspx";
</script>
所有这些都是设置锚标记的 href 。除非用户单击该链接,否则它不会执行任何操作。
2021-05-08 22:26:32