Добро пожаловать в будущее!
Прямо сейчас у нас есть свойство responseURL из объекта xhr. УРА!
См. Раздел Как получить URL-адрес ответа в XMLHttpRequest?
Однако jQuery (как минимум 1.7.1) не дает прямого доступа к объекту XMLHttpRequest. Вы можете использовать что-то вроде этого:
var xhr;
var _orgAjax = jQuery.ajaxSettings.xhr;
jQuery.ajaxSettings.xhr = function () {
xhr = _orgAjax();
return xhr;
};
jQuery.ajax('http://test.com', {
success: function(responseText) {
console.log('responseURL:', xhr.responseURL, 'responseText:', responseText);
}
});
Это не чистое решение, и я полагаю, что команда jQuery сделает что-нибудь для responseURL в будущих выпусках.
СОВЕТ : просто сравните исходный URL с responseUrl. Если он равен, то перенаправления не было. Если он «undefined», то responseUrl, вероятно, не поддерживается. Однако, как сказал Ник Гарви, запрос AJAX никогда не имеет возможности НЕ следовать перенаправлению, но вы можете решить ряд задач, используя свойство responseUrl .
Хотя другие люди, ответившие на этот вопрос, (к сожалению) правы в том, что эта информация скрыта от нас браузером, я решил опубликовать обходной путь, который я придумал:
Я настроил свое серверное приложение для установки настраиваемого заголовка ответа (
X-Response-Url
), содержащего запрошенный URL-адрес. Всякий раз, когда мой код ajax получает ответ, он проверяет,xhr.getResponseHeader("x-response-url")
определен ли он, и в этом случае сравнивает его с URL-адресом, который он изначально запрашивал$.ajax()
. Если строки различаются, я знаю, что было перенаправление, и, кроме того, какой URL мы на самом деле пришли.У этого есть недостаток, заключающийся в том, что требуется некоторая помощь на стороне сервера, а также может возникнуть сбой, если URL-адрес будет изменен (из-за проблем с цитированием / кодированием и т.д.) во время кругового перехода ... но в 99% случаев это, похоже, получает работа сделана.
На стороне сервера моим конкретным случаем было приложение Python, использующее веб-фреймворк Pyramid, и я использовал следующий фрагмент:
источник
Теперь вы можете использовать fetch API / он возвращает
redirected: *boolean*
источник