Возможно ли, чтобы запросы XHR HEAD не выполняли перенаправления (301 302) - PullRequest
23 голосов
/ 29 сентября 2010

Можно ли отправить 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, похоже, указывает, что запросы должны выполняться, есть ли способ остановить это?

Ответы [ 4 ]

18 голосов
/ 29 сентября 2010

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

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

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

6 голосов
/ 29 сентября 2010

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

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

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

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

0 голосов
/ 23 марта 2017

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

Я был почти в отчаянии, когда нашел ответ: https://stackoverflow.com/a/8056313/995007

Пример:

    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();
0 голосов
/ 14 июля 2013

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...