捕获javascript XMLHttpRequest的重定向位置

时间:2010-12-16 21:29:45

标签: javascript jquery xmlhttprequest

我知道在使用XMLHttpRequest时,你不能拦截重定向或阻止重定向,因为浏览器会透明地跟随它,但它是否可能

一个。确定重定向的请求,或

B中。确定重定向到哪里? (假设响应没有提示)

示例代码:

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

在我的情况下,firebug将首先向网址显示POST,然后向重定向的网址显示GET。可以捕获GET位置吗?

2 个答案:

答案 0 :(得分:3)

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

应该有“位置”标题,但这取决于服务器,哪些标题会被发回...

答案 1 :(得分:2)

4年后,现在可以在Chrome 42+(Opera 29+)和Firefox 39+中使用来自XHR实例的responseURL找到最后一个重定向位置,但它在IE,Edge或野生动物园。