Подтвердить что ты не робот

Возможно ли, чтобы запросы 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/#infrastructure-for-the-send-method, похоже, указывает, что запросы должны соблюдаться, есть ли способ остановить это?

4b9b3361

Ответ 1

Нет, это не подверженное действию поведение, которое вы можете остановить.

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Я был почти в отчаянии, когда нашел этот ответ: fooobar.com/questions/77279/...

Пример:

    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();

Ответ 4

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

Основные браузеры перестанут перенаправлять, если слишком много перенаправлений. В 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 количество переадресаций слишком много и меньше??

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