JavaScript window.location не устанавливает референт в заголовке запроса
Я понимаю, что полагаться на 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="#" onclick="location.href='https://hardcode.server.url/path/folder/page.aspx'; return false;">Link 1</a>
Ответы
Ответ 1
Заголовок сообщения показывает, что вы хотите изменить текущую страницу программным образом с помощью 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.
Ответ 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
Ответ 3
У меня недостаточно очков, чтобы прокомментировать ответ Эвана, чтобы предложить исправление, поэтому все, что я могу сделать, это опубликовать здесь исправление. Короче говоря, 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, с которой мне пришлось работать.
Ответ 4
Возможно ли инициировать событие click (или любого элемента) клика через JavaScript? использует решение createEvent/dispatchEvent или createEventObject/fireEvent.
Ответ 5
Yeap, твой тоже работает, но закончил:
<a href="#" id="linkOne">Link 1</a>
<script type="text/javascript">
document.getElementById("linkOne").href = "https://" + serverURL + "/path/folder/page.aspx";
</script>