JavaScript window.location не устанавливает referer в заголовке запроса - PullRequest
28 голосов
/ 21 января 2011

Я понимаю, что полагаться на Referer в заголовке запроса не правильно.Но мой вопрос: почему 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 ]

35 голосов
/ 06 февраля 2012

Заголовок вашего сообщения показывает, что вы хотите программно изменить текущую страницу, используя JavaScript, но при этом предоставив HTTP-реферер (насколько я понял, использование тега <a> предназначено только для теста).

Вам необходимо знать о проблемах между браузерами:

  • Заголовок реферера HTTP (HTTP-Referer) устанавливается при изменении window.location.href в следующих браузерах:
    • 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 .

18 голосов
/ 21 января 2011

Настройка 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

4 голосов
/ 27 октября 2011

У меня недостаточно очков, чтобы прокомментировать ответ Эвана, чтобы предложить исправление, поэтому все, что я могу сделать, это опубликовать исправление здесь.Короче говоря, в 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;
    }
}

Это работает в нашей среде HTTPS с IE7, IE8, FF3, FF7 и Chrome,Так что я думаю, что это работает и в FF5.Без этого обходного пути мы получаем 403 ошибки в IE7 и IE8 при попытке установить window.location.Что касается вопроса Ша Ле о том, почему IE делает это, я могу только догадываться, что они считают его слишком ненадежным.У меня была похожая проблема с window.open в IE, с которой мне также пришлось обходиться.

0 голосов
/ 24 июня 2011

Можно ли вызвать событие щелчка ссылки (или любого элемента) через JavaScript? использует решение createEvent / dispatchEvent или createEventObject / fireEvent.

0 голосов
/ 21 января 2011

Да, у вас тоже все работает, но в итоге вы сделали:

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

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