Запретить перенаправление Xmlhttprequest
-
03-07-2019 - |
Вопрос
Можно ли запретить браузеру следовать перенаправлениям при отправке XMLHttpRequest (т.е.чтобы вернуть код состояния перенаправления и обработать его самостоятельно)?
Решение
Не согласно стандарт W3C для объекта XMLHttpRequest (выделено мной):
Если ответ представляет собой перенаправление HTTP:
Если происхождение URL -адреса, передаваемого заголовком местоположения, является одинаковым источником с происхождением xmlhttprequest, а перенаправление не нарушает меры предосторожности бесконечных петлей, прозрачно следуйте перенаправлению Наблюдая за тем же оригинальным запросом правил события.
Они были учитывая это для будущего выпуска:
Эта спецификация не включает следующие функции, которые рассматриваются для будущей версии этой спецификации:
- Свойство отключить следующие перенаправления;
но последний в спецификации об этом больше не упоминается.
Другие советы
Новый API Fetch поддерживает различные режимы обработки перенаправления : 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-адрес, не загрузив с него всю страницу.
Вы можете использовать свойство responseURL
, чтобы получить место назначения перенаправления или проверить, был ли ответ в конечном итоге получен из местоположения, которое вы принимаете.
Это, конечно, означает, что в любом случае результат извлекается, но, по крайней мере, вы можете получить необходимую информацию о месте назначения перенаправления и, например, определить условия, когда вы хотите отказаться от ответа.
Нет, в API нет места, предоставляемого XMLHttpRequest, которое позволяло бы вам переопределить поведение по умолчанию, согласно которому 301 или 302 автоматически.
Если на клиенте запущен IE в Windows, вы можете вместо этого использовать WinHTTP, чтобы установить параметр, предотвращающий такое поведение, но это очень ограничивающее решение.