Возможно ли, чтобы запросы XHR HEAD не соответствовали переадресации (301 302)
Можно ли отправить запрос xhr HTTP HEAD только получить ответ заголовка для первого запроса, а не автоматически следовать 301, 302, как перенаправление? Меня интересует только новое местоположение URL-адреса. Пример:
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(data) {
if (xhr.readyState == 4) {
if (xhr.status == 301 || xhr.status == 302) {
// Get new location url don't GET it
}
}
};
xhr.open('HEAD', url, true);
xhr.send();
http://www.w3.org/TR/XMLHttpRequest/#infrastructure-for-the-send-method, похоже, указывает, что запросы должны соблюдаться, есть ли способ остановить это?
Ответы
Ответ 1
Нет, это не подверженное действию поведение, которое вы можете остановить.
Из-за спецификации, которую вы уже установили, указанное поведение заключается в том, что XmlHttpRequest должен прозрачно следовать переадресации... под обложками, к сожалению, и не так, как вы может предотвратить.
Это так, чтобы попытаться сделать что-то проще, если ресурсы перемещаются и т.д., но когда он был разработан и специфицирован, все эти службы перенаправления не были там. Просто не было никакой необходимости в каком-либо другом поведении или способности предотвратить это, я думаю, что с таким количеством переадресаций, попадающих в сеть, мы не увидим добавленную возможность, но кто знает, когда каждый браузер будет ее поддерживать.
Ответ 2
Спецификация W3C требует, чтобы переадресация выполнялась автоматически, а @Nick предлагалась в другом ответе. Однако свойство отключить перенаправления рассмотренное W3C для будущей версии этой спецификации:
Эта спецификация не включает следующие функции, которые рассматриваются для будущей версии этой спецификации:
- атрибут load event и onload;
- событие ошибки и атрибут onerror;
- событие прогресса и атрибут onprogress;
- прервать событие и атрибут onabort;
- Были предложены таймеры, возможно, атрибут ontimeout;
- Свойство для отключения следующих перенаправлений
- responseXML для текстовых/html-документов;
- Межсайтовый XMLHttpRequest;
- responseBody для обработки байтовых потоков;
- overrideMimeType для исправления типов MIME;
- getRequestHeader() и removeRequestHeader().
Однако я бы не задерживал дыхание, пока это не будет реализовано всеми браузерами. Для этого вы можете использовать прокси-сервер на стороне сервера. Просто напишите короткий script, чтобы сделать запрос HEAD
на вашем любимом серверном языке/фреймворке, а затем используйте Ajax для запроса этой услуги. Вы также сможете выполнять запросы сторонних доменов через прокси-сервер в качестве положительного побочного эффекта.
Ответ 3
А теперь это возможно! по крайней мере, в браузерах Firefox и Chrome.
Я был почти в отчаянии, когда нашел этот ответ: fooobar.com/questions/77279/...
Пример:
var xhttp = new XMLHttpRequest();
xhttp.onload = function() {
console.log(xhttp.responseURL); // Here you are!
};
xhttp.open('GET', 'https://www.ddd.com/news', true);
xhttp.send();
Ответ 4
Остановить перенаправление ВОЗМОЖНО.
Основные браузеры перестанут перенаправлять, если слишком много перенаправлений. В chrome вы получите сообщение об ошибке ERR_TOO_MANY_REDIRECTS после перенаправления 20 раз. Протестируйте такой код (сохраните его как redir.php):
<?php
$times = isset($_GET['t']) ? intval($_GET['t']) : 1;
if ( $times < 20) {
header("Location: redir.php?t=".strval($times+1));
} else {
header("Location: http://the.final.target.url/which.will.give.you.a.301.header.but.you.do.not.want.to.follow.it");
}
Затем вы обнаружите, что перенаправление будет остановлено, пока мы исключили. Также работает с xhr и общим JS, например (new Image).src="some.url"
.
Еще одна вещь: ограничение ограничений перенаправления отличается между браузерами. Вы можете проверить и найти номер по redir.php самостоятельно или найти его из этой темы: В Chrome количество переадресаций слишком много и меньше??
Рад, если полезно:)