Захватить местоположение перенаправления JavaScript XMLHttpRequest - PullRequest
17 голосов
/ 17 декабря 2010

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

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

B.Определите , куда он перенаправлен?(при условии, что ответ не дает подсказок)

Пример кода:

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

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

Ответы [ 2 ]

3 голосов
/ 17 декабря 2010

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');
});

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

2 голосов
/ 28 октября 2015

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

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