2010-12-16 131 views
17

我知道你不能,使用XMLHttpRequest對象時,攔截重定向或阻止它,瀏覽器會透明地遵循它,但有可能要麼捕獲重定向位置

A.確定是否請求重定向,或

B.確定其中它重定向到? (假設響應沒有給出提示)

示例代碼:

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

在我的情況下,螢火首先會顯示一個POST到URL,則GET到重定向的URL。該GET位置可以被捕獲嗎?

+0

你只是得到了什麼是在響應頭。 – epascarello 2010-12-16 21:40:17

+1

xmlHttpRequest.getAllResponseHeaders()似乎沒有給出任何指示它的URL。 – Snea 2010-12-16 21:41:52

+3

有人在客戶端找到任何解決方法嗎?如果沒有Web服務器的控制權,如何捕獲重定向URL。 – 2012-03-28 13:07:28

回答

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請求,這是沒有必要的,所以當發佈請求是ajax時,我轉而轉向(只是轉發到不同的控制器 - 取決於您的服務器端fra工作,或者你在用什麼......)。 POST請求不會被瀏覽器緩存。

其實,我不知道什麼是你需要的原因,所以這可能不會對你非常有用。這是有益的,當服務器返回比普通請求Ajax請求不同的反應,因爲當瀏覽器重定向Ajax請求,重定向請求不XMLHttpRequest的...

[更新]

您可以訪問頭(中轉發請求)這樣的:

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

應該有「位置」頭,但它依賴於服務器,這頭被髮回...

+0

不幸的是,這是一個模擬填寫表單的帖子,而不是ajax api,所以我無法控制從它發回的狀態碼,或者它是否重定向。 – Snea 2010-12-16 23:35:58

+0

對不起,我不明白你的意見。你的意思是,服務器端不是由你自己管理的?那麼,你不能改變服務器端? – Vojta 2010-12-17 11:08:57

3

4年後現在可以使用來自Chrome 42+(Opera 29+)和Firefox 39+中的XHR實例的響應URL來查找最後的重定向位置,但它在IE,Edge或Safari中尚未提供。