Возможно ли, чтобы запросы 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 слишком много?
Рад, если полезно:)