2011-01-13 65 views
3

我有一個簡單的PHP頁面(用於測試),簡單地調用header("Location: http://www.example.com ");exit;,駐留在同一臺服務器上,在同一個目錄中有以下的jQuery的Javascript另一個文件:jQuery AJAX不重定向?

$(document).ready(function() { 
    jQuery.ajax({ 
     type : 'GET', 
     url : 'bounce.php', 
     error : function(xhr, status, error) { 
      console.log("ERROR: ", xhr, xhr.status, xhr.getAllResponseHeaders()); 
     }, 
     complete : function(xhr, status) { 
      // Get headers of the response 
      console.log("COMPLETE: ", xhr, xhr.status, xhr.getAllResponseHeaders()); 
     } 
    }); 
}); 

我期待(從幾個其他StackOverflow響應)爲xhr.status返回「302」,但AJAX調用正在觸發「錯誤」事件(然後是「完成」事件),並且xhr.status正在返回0(零),並且.getAllResponseHeaders()正在返回null (在錯誤和完整功能中)。

Firebug顯示「302 Moved Temporarily」和響應標題。 那麼爲什麼會觸發錯誤事件,而不是傳遞正確的302代碼和標題?這是因爲彈跳腳本和抓取腳本都在同一個服務器上,所以它與同源相關嗎?這是jQuery或Javascript的錯?

回答

1

我認爲錯誤與瀏覽器安全錯誤有關。如果您對此不熟悉,那麼您應該知道使用XMLHttpRequest只能訪問同一臺服務器上的文件。因此,重定向到example.com將導致錯誤,因爲您可能不在example.com上。

+0

正確,但我希望javascript至少能夠找出頁面試圖重定向到的位置。但是,現在,getReponseHeaders沒有返回任何內容,所以我無法獲取該「位置」標題。 – MidnightLightning 2011-01-13 21:23:46

3

XMLHttpRequest透明地處理301和302錯誤;也就是說,它會將重定向視爲您首先觸發了重定向的URL,並且重定向本身不計爲事件。重定向時,就像原始網址從未存在過,因此最終只會得到最終重定向URL返回的狀態代碼。

因此,你永遠不會結束301或302狀態碼。所以這聽起來像是你遇到了Amir所說的,而上述政策將阻止你捕獲所需的狀態代碼來檢查這種情況。

0

因此,隨着阿米爾和V64信息的組合,我想我明白了:相關點

  • 螢火蟲不一定使用的XMLHttpRequest的相同的請求,所以標題可能會有所不同
  • 的XMLHttpRequest無法獲取遠程服務器上的文件(試圖獲取「http://www.example.com」直接失敗)
  • 的XMLHttpRequest重定向處理透明的,所以本地文件看起來像一個遠程文件到它。

最終結果:單獨使用Javascript無法實現OpenID,它需要從與處理遠程文件查找的服務器本身相同的服務器上獲取腳本。

而且,遇到此安全牆時,對XMLHttpRequest的錯誤響應不會給出非常有用的錯誤。