2013-06-21 48 views
3

Code。爲什麼誰可以排除同源策略?

$.ajax({ 
    type : "get", 
    url : "http://www.facebook.com",   
    success: function(data){ 
      console.log(data); 
    } 
}); 

作品和

$.ajax({ 
    type : "get", 
    url : "http://www.google.com",   
    success: function(data){ 
      console.log(data); 
    } 
}); 

扔瀏覽器控制檯上著名的XMLHttpRequest cannot load同源策略的例外!

爲什麼?我想這取決於瀏覽器?

+1

http://enable-cors.org/ –

+0

你的小提琴不起作用 - 它只是不會產生錯誤。 – apsillers

+0

對Facebook的請求沒有達到成功回調並且沒有得到回覆。該請求在達到相同的原點錯誤之前似乎已被取消。 –

回答

8

http://www.facebook.com發送一個301 Moved Permanently響應,該響應重定向到https://www.facebook.com

看起來,重定向導致請求失敗比徹底的跨域失敗更安靜。但是,這兩個請求失敗。

EDIT

按照W3C Ajax specification

如果響應具有301的HTTP狀態代碼302,303,307,或308 ...

  1. 將請求URL設置爲Location標頭傳送的URL。
  2. 如果源出處和請求URL的來源是相同的,那麼在觀察同源請求事件規則時透明地遵循重定向。
  3. 否則,請遵循交叉原點請求步驟並終止該算法的步驟。

文本「透明跟隨重定向」表示阿賈克斯應該把301的目標重定向作爲原始目標。但是,執行重定向時,將根據新的目標原點重新檢查同源策略。

目標域也必須與請求腳本具有相同的來源,或者它必須使用允許請求源訪問的CORS頭進行響應。

+0

jQuery不會在ajax調用中遵循任何重定向(至少不會在最後一次檢查時)。如果瀏覽器支持CORS,可能跨域策略只有在最終的url不允許訪問時纔會被違反。 (但我需要檢查規格,以確保這一點) –

+0

您能更具體地瞭解「更安靜地失敗」嗎? – markzzz

+0

@t。niese Ajax重定向非常有效;請參閱W3C規範中引用的我的編輯。 – apsillers

1

這是由服務器(臉譜,谷歌等),以允許他們的內容跨域加載。這被稱爲跨源資源共享。要在服務器上啓用CORS,請在回覆中提供以下標題:Access-Control-Allow-Origin: *

您無法更改不屬於您的服務器的行爲。

+0

好吧,但是允許所有的域作爲起源('*')是一個壞主意,這完全禁用SOP。 – Tali