Запретить перенаправление Xmlhttprequest

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


person Zim    schedule 23.10.2008    source источник


Ответы (5)


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

Если ответ представляет собой перенаправление HTTP:

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

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

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

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

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

person Boy Baukema    schedule 05.12.2008
comment
Что смешно, так это когда прозрачное перенаправление включает перезапись некоторых заголовков HTTP, которые были установлены в исходном запросе. В частности, если для заголовка Accept был задан определенный тип содержимого, Firefox не сможет включить этот заголовок после перенаправления (что немного затрудняет разработку полностью основанных на REST веб-сервисов, использующих этот заголовок ... ворчание) . - person ruquay; 26.05.2011
comment
Еще один поиск принес мне этот довольно старый отчет об ошибке: bugzilla.mozilla.org/show_bug.cgi ? id = 401564 - person ruquay; 26.05.2011
comment
Согласитесь, совершенно недоработан дизайн недоработки. - person Rasive; 12.12.2014

Новый 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, не загружая с него всю страницу.

person user    schedule 07.11.2015
comment
Иногда использование OPTIONS может быть лучшим выбором, в любом случае работает только для не общих целей и т. Д. Администратор настроил перенаправление всего сайта / схемы, например HTTP - ›HTTPS - person William Leung; 21.12.2016

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

person Roland Pihlakas    schedule 09.02.2015
comment
Не работает в IE developer.mozilla.org/en-US / docs / Web / API / XMLHttpRequest / - person HMR; 16.10.2018

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

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

person AnthonyWJones    schedule 23.10.2008

Невозможно обрабатывать перенаправление или статус 302 на стороне клиента, как указано в других комментариях. Однако вы можете предотвратить перенаправление. Для этого вы можете установить заголовок запроса X-Requested-With с помощью XMLHttpRequest xhttp.setRequestHeader (X-Requested-With, XMLHttpRequest); Это нужно делать после открытия, но перед отправкой. Пример ниже

let xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
   if (this.readyState == 4 && this.status == 200) {
         reqObj.success(JSON.parse(this.responseText))
   } else if (this.status != 200) {
         reqObj.error(this.statusText)
   }
};
xhttp.open(reqObj.type, reqObj.url, reqObj.async);
xhttp.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xhttp.send();
person Shahzoob    schedule 06.10.2020
comment
Это единственное рабочее решение! Спасибо! - person user1589188; 16.03.2021