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

Захват перенаправления местоположения JavaScript XMLHttpRequest

Я знаю, что вы не можете, используя XMLHttpRequest, перехватить перенаправление или предотвратить его, поскольку браузер будет прозрачно следовать за ним, но возможно ли это сделать

а. Определите, перенаправлен ли запрос, или

В. Определить, куда он перенаправляется? (предполагая, что ответ не дает никаких подсказок)

Пример кода:

$.post("/my-url-that-redirects/", {}, 
    function(response, statusCode, xmlHttpRequest){
        //Somehow grab the location it redirected to
    }
);

В моем случае firebug сначала покажет POST для URL-адреса, а затем GET для перенаправленного URL-адреса. Можно ли захватить местоположение GET?

4b9b3361

Ответ 1

1) Используйте другой код состояния, чем 301 (2 **) (если запрос ajax) и перенаправление дескриптора на стороне клиента:

var STATUS = {
  REDIRECT: 280
};

$.post('/redirected', {}, function(response, status, request) {
  if (status == STATUS.REDIRECT) {
    // you need to return the redirect url
    location.href = response.redirectUrl;
  } else {
    $('#content').html(request.responseText);
  }
});

2) НЕ ПЕРЕДАЙТЕ:

Я использую это в "перенаправлении шаблона" = перенаправление после почтового запроса (вы не хотите разрешать пользователю обновлять почтовый запрос и т.д.)

С помощью ajax-запроса это необязательно, поэтому, когда post-запрос является ajax, я вместо этого пересылаю (просто пересылаю другой контроллер - зависит от вашей серверной структуры или того, что вы используете...). Запросы POST не кэшируются браузерами.

Собственно, я не знаю, в чем причина, в которой вы нуждаетесь, поэтому это может быть не так полезно для вас. Это полезно, когда сервер возвращает разные ответы на запросы ajax, чем обычные запросы, потому что когда браузер перенаправляет запрос ajax, перенаправленный запрос не является XMLHttpRequest...

[обновлено]

Вы можете получить доступ к заголовкам (перенаправленного запроса) следующим образом:

$.post('redirected', {}, function(r, s, req) {
  req.getAllResponseHeaders();
  req.getResponseHeader('Location');
});

Должен быть заголовок "Местоположение", но он зависит от сервера, от которого отправляются заголовки...

Ответ 2

Через 4 года можно найти последнее место перенаправления с помощью responseURL из экземпляра XHR в Chrome 42+ (Opera 29+) и Firefox 39+, но пока недоступно в IE, Edge или Safari.