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

112

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

Зим
источник

Ответы:

102

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

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

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

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

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

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

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

Мальчик Баукема
источник
5
Что смешно, так это когда прозрачное перенаправление включает перезапись некоторых заголовков HTTP, которые были установлены в исходном запросе. В частности, если для заголовка «Принять» был задан определенный тип содержимого, Firefox не сможет включить этот заголовок после перенаправления (что немного затрудняет разработку полностью основанных на REST веб-сервисов, использующих этот заголовок ... ворчать).
ruquay
1
Еще немного поисков принесло мне этот довольно старый отчет об ошибке: bugzilla.mozilla.org/show_bug.cgi?id=401564
ruquay
2
Согласитесь, совершенно недоработан дизайн.
Rasive
35

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

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

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

Роланд Пихлакас
источник
11

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

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

ЭнтониУ Джонс
источник