Можно ли предотвратить переадресацию браузера при отправке XMLHttpRequest-s (т.е. вернуть код статуса перенаправления и обработать его самостоятельно)?
Предотвращение перенаправления Xmlhttprequest
Ответ 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
для получения адресата перенаправления или проверить, был ли ответ получен в конечном итоге из местоположения, которое вы принимаете.
Это, конечно, означает, что результат все равно получен, но по крайней мере вы можете получить необходимую информацию о назначении перенаправления и, например, обнаружить условия, когда вы хотите отменить ответ.