2011-08-05 24 views
17

我正在使用jQuery 1.6.2向同一個域上的頁面發出POST AJAX請求。該頁面將302重定向到另一頁面。在AJAX調用中,沒有遵循302的方法

現在,在我的本地機器上工作正常,但在我們的生產服務器上,重定向從未被遵循,並且在Chrome檢查器中,請求被稱爲「取消」。

如果我訪問同一頁面不涉及JavaScript的,一切工作正常,當我說,AJAX的作品我的本地計算機上,但不是在生產服務器上。

有誰知道什麼可能會導致此?

服務器(OS X,Apache2,PHP5.3.6,本地機器上的HTTP,Ubuntu,Lighttpd,PHP5.3.3,生產中的HTTPS)之間存在一些差異,但對我而言,沒有任何區別。

+1

我假設302重定向到同一個域上的另一個資源? –

+0

確實。原來在kohana中存在一個錯誤,雖然這導致重定向爲HTTP而不是HTTPS。這一定導致瀏覽器取消請求。 – Johan

+3

優秀。在下面添加這個答案 - 在兩天內,您將能夠接受您的答案爲正確答案,以便將來遇到類似問題的人員可以找到答案。 –

回答

11

原來在重定向代碼中的錯誤引起的重定向到http://,而被請求的頁面是https://開頭。這使瀏覽器拒絕遵循重定向。

+1

因此,您如何解決您的查詢,同樣也是我面臨的問題。 –

6
function doAjaxCall() { 
    $.ajaxSetup({complete: onRequestCompleted}); 
    $.get(yourUrl,yourData,yourCallback); 
} 

function onRequestCompleted(xhr,textStatus) { 
    if (xhr.status == 302) { 
     location.href = xhr.getResponseHeader("Location"); 
    } 
} 

以下是與您的答案有關的問題。你可以從下面的鏈接找到答案。

Catching 302 FOUND in JavaScript

How to manage a redirect request after a jQuery Ajax call

+4

瀏覽器不應該將302傳遞給JS,因爲瀏覽器會透明地處理重定向,所以jQuery永遠不會知道它被重定向。我不清楚這是否是所有的瀏覽器,但Chrome明確這樣做,其他都報告過Opera/FF。 – DanH

+0

'瀏覽器不應該通過一個302 JS'並不意味着你必須投票回答。嘗試上面的代碼你自己,然後把正確的答案,如果這是錯誤的,而不知道下來投票。並看到3 upvotes以及 –

+6

'xhr.status == 302'應該不會發生,因爲302將由瀏覽器處理,然後只會返回一個200或其他錯誤代碼給JS,所以我認爲這種反作用的建議。但是,我會刪除-1,因爲您鏈接到其他問題。我將提供一個不同的答案。 – DanH

2

基於這樣的回答:https://stackoverflow.com/a/8752354/698289我發現下面的代碼是非常有用的:

$('body').ajaxComplete(function (e, xhr, settings) { 
    if (xhr.status == 200) { 
     var redirect = null; 
     try { 
      redirect = $.parseJSON(xhr.responseText).redirect; 
      if (redirect) { 
       window.location.href = redirect; 
      } 
     } catch (e) { 
      return; 
     } 
    } 
}); 

然後你只需提供JSON,如以下幾點:

{redirect: '/redirect/to/this/path'} 

而且ajaxComplete將確保重定向瀏覽器。

當心,$.ajax('complete') AFTER觸發器$.ajax('success')$.ajax('error')

+0

我不認爲這是一個好的解決方案。這是否意味着我必須把它放在每一頁上?如果我理解錯了,請糾正我。 – smwikipedia

+0

上面的代碼是Javascript,因此只有在需要每個頁面的Web瀏覽器中加載時纔會運行。 – DanH

2

我認爲這是一個服務器端的問題,而不是客戶端。瀏覽器是正確的,當它通過https發出一個jax請求時,不遵循重定向到http,因爲這將是一個安全缺陷。

我意識到我正在使用相對路徑,如HttpResponseRedirect('/path/to/')。在某些層,該URL與http://前綴前綴,這也正是收到的瀏覽器:http://example.com/path/to/

您必須確保Location在響應頭被髮送一個完整的路徑,包括https://

相關問題