Возможно ли, чтобы запросы XHR HEAD не выполняли перенаправления (301 302)

Можно ли отправить xhr HTTP HEAD-запрос, чтобы получить только заголовочный ответ для первого запроса и не выполнять автоматически 301, 302, как перенаправления? Я заинтересован только в получении нового местоположения URL. Пример:

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(data) {
    if (xhr.readyState == 4) {
        if (xhr.status == 301 || xhr.status == 302) {
            // Get new location url don't GET it
        }
    }
};
xhr.open('HEAD', url, true);
xhr.send();

http://www.w3.org/TR/XMLHttpRequest/ видимому, указывает, что запросы должны выполняться, есть ли способ остановить это?

4 ответа

Решение

Нет, это не разоблачающее поведение, которое вы можете остановить.

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

Именно так можно попытаться упростить ситуацию, если ресурсы будут перемещаться и т. Д.... но когда она была разработана и изложена спецификация, всех этих служб перенаправления не было. Просто не было острой необходимости в каком-либо другом поведении или возможности предотвратить его, я думаю, что с таким большим количеством перенаправлений, попадающих в Интернет, мы не увидим добавленную возможность, но кто знает, когда каждый браузер поддержит ее.

Спецификация W3C требует, чтобы перенаправления выполнялись автоматически, как @Nick предложил в другом ответе. Однако свойство для отключения перенаправлений рассматривается W3C для будущей версии этой спецификации:

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

  • событие загрузки и атрибут загрузки;
  • событие ошибки и атрибут onerror;
  • событие progress и атрибут onprogress;
  • событие отмены и атрибут onabort;
  • Были предложены таймеры, возможно, атрибут ontimeout;
  • Свойство отключить следующие перенаправления;
  • responseXML для текстовых / HTML-документов;
  • Межсайтовый XMLHttpRequest;
  • responseBody для работы с потоками байтов;
  • overrideMimeType для исправления типов MIME;
  • getRequestHeader () и removeRequestHeader().

Тем не менее, я не задерживаю дыхание, пока это не реализовано всеми браузерами. Возможно, вы захотите использовать прокси на стороне сервера, чтобы справиться с этим. Просто напишите короткий сценарий, чтобы сделать HEAD запросите на своем любимом серверном языке / фреймворке, а затем используйте Ajax для запроса этого сервиса. Вы также сможете отправлять запросы на сторонние домены через прокси-сервер в качестве положительного побочного эффекта.

И теперь это возможно! по крайней мере, в браузерах Firefox и Chrome

Я был почти в отчаянии, когда я нашел этот ответ: /questions/47503026/kak-poluchit-url-otveta-v-xmlhttprequest/47503036#47503036

Пример:

    var xhttp = new XMLHttpRequest();
    xhttp.onload = function() {
        console.log(xhttp.responseURL); // Here you are!
    };
    xhttp.open('GET', 'https://www.ddd.com/news', true);
    xhttp.send();

Остановить перенаправление ВОЗМОЖНО.

Основные браузеры прекратят перенаправление, если будет слишком много перенаправлений. В chrome вы получите ошибку ERR_TOO_MANY_REDIRECTS после 20 раз перенаправления. Протестируйте код следующим образом (сохраните его как redir.php):

<?php
$times = isset($_GET['t']) ? intval($_GET['t']) : 1;
if ( $times < 20) {
    header("Location: redir.php?t=".strval($times+1));
} else {
    header("Location: http://the.final.target.url/which.will.give.you.a.301.header.but.you.do.not.want.to.follow.it");
}

Тогда вы найдете, что перенаправление будет остановлено, как мы исключили. Также работает с XHR и обычным JS, как (new Image).src="some.url",

Еще одна вещь, ограничение максимального перенаправления отличается в разных браузерах. Вы можете проверить и найти номер с помощью redir.php самостоятельно или найти его в этой теме: Сколько перенаправлений в Chrome слишком много?

Рад, если полезно:)

Другие вопросы по тегам