Предотвращение перенаправления Xmlhttprequest

Можно ли предотвратить переадресацию браузера при отправке XMLHttpRequest-s (т.е. вернуть код статуса перенаправления и обработать его самостоятельно)?

Ответ 1

Не соответствует стандарт W3C для объекта XMLHttpRequest (выделено мной):

Если ответ является перенаправлением HTTP:

Если источник URL, переданный заголовком "Место", совпадает с источником   с источником XMLHttpRequest и   перенаправление не нарушает бесконечные   петлевые меры предосторожности, прозрачно   после перенаправления при наблюдении   правила события запроса с одинаковым исходным кодом.

Они были рассматривали его для будущего выпуска:

Эта спецификация не включает следующие функции, которые рассматривается для будущей версии эта спецификация:

  • Свойство для отключения следующих перенаправлений;

но спецификация больше не упоминает об этом.

Ответ 2

Новый Fetch API поддерживает различные режимы обработки перенаправления: follow, error и manual, но я могу не найти способ просмотра нового URL-адреса или кода состояния при отмене перенаправления. Вы можете просто остановить перенаправление, а затем оно выглядит как ошибка (пустой ответ). Если это все, что вам нужно, вам хорошо идти. Также вы должны знать, что запросы, сделанные с помощью этого API, не отменены Они теперь.

Что касается XMLHttpRequest, вы можете HEAD сервера и проверить, изменился ли URL:

var http = new XMLHttpRequest();
http.open('HEAD', '/the/url');
http.onreadystatechange = function() {
    if (this.readyState === this.DONE) {
        console.log(this.responseURL);
    }
};
http.send();

Вы не получите код состояния, но найдете новый URL-адрес без загрузки всей страницы.

Ответ 3

Нет, в API, подверженном XMLHttpRequest, нет места, которое позволяет автоматически переопределять поведение по умолчанию после 301 или 302.

Если клиент запускает IE в Windows, вы можете использовать WinHTTP вместо этого, чтобы установить опцию для предотвращения этого поведения, но это очень ограничивающее решение.

Ответ 4

Вы можете использовать свойство responseURL для получения адресата перенаправления или проверить, был ли ответ получен в конечном итоге из местоположения, которое вы принимаете.
Это, конечно, означает, что результат все равно получен, но по крайней мере вы можете получить необходимую информацию о назначении перенаправления и, например, обнаружить условия, когда вы хотите отменить ответ.