2013-11-03 42 views
0

http://www4.example.com會嘗試一個XHR連接到http://www6.example.com/ 瀏覽器中的網頁發送與該頭中的GET請求:CORS投訴(窗口7)

Origin: http://www4.example.com 

的www6.example.com服務器發回:

Access-Control-Allow-Credentials: true 
Access-Control-Allow-Origin: http://www4.example.com 
Connection: Keep-Alive 
Content-Encoding: gzip 
Content-Type: text/plain 
Date: ... 
Keep-Alive: timeout=5, max=100 
Transfer-Encoding: Identity 
Server: Apache/2.2.20 (Ubuntu) 
Vary: Accept-Encoding 
X-Powered-By: PHP/5.3.6-13ubuntu3.7 

可是我得到:

XMLHttpRequest cannot load http://www6.example.com/myscript.php?xhr=1&t=1234333223. Origin http://www4.example.com is not allowed by Access-Control-Allow-Origin. 

我的代碼符合我對CORS標準的理解,並且適用於Chrome,Firefox,Opera等,因此我將假定這是一個Safari 5.1的bug?我的問題是我需要做些什麼來解決它?

回答

1

經過大量的反覆試驗,看網絡流量,我覺得我可以自我回答。

Safari的缺陷是,它首先發送OPTIONS預先請求,即使它是GET請求。

要增加一些額外的複雜性,它似乎只發送第二個請求。 (我想這是因爲我的第二個請求發送了一個額外的自定義頭......但我實際上無法隔離它,所以我認爲還有其他事情正在進行 - 也許是緩存交互?)

發送Access-Control-Allow-Headers in主要的迴應並不能解決問題:它首先執行OPTIONS請求,所以永遠不會得到那麼多。

我做的修復是把這個在PHP腳本的最頂端:

if($_SERVER['REQUEST_METHOD'] == 'OPTIONS'){ 
    header("Access-Control-Allow-Origin: "[email protected]$_SERVER['HTTP_ORIGIN']); 
    header("Access-Control-Allow-Credentials: true"); 
    header("Access-Control-Allow-Headers: Last-Event-Id, Origin, X-Requested-With, Content-Type, Accept, Authorization"); 
    exit; 
    } 

發回的「訪問控制允許報頭:*」做了工作。你必須明確列出你想要的標題。我簡單地進行了實驗,看起來它們是不區分大小寫的。

發送「Access-Control-Allow-Methods:POST,GET,OPTIONS」不需要。

另外,Cookies 發送的是,但不會發送基本身份驗證詳細信息(儘管在那裏明確列出了授權標頭)。這可能是CORS實現的故意限制,就像這個版本的WebKit(534.57.2)一樣,不是一個bug。

+0

根據規範,如果請求包含一個不被視爲「簡單標題」的標題,即。授權,需要預檢請求。所以,這不是一個錯誤。 –