2015-09-01 75 views
8

我對Safari處理CORS請求的方式有問題。請考慮以下情形:Safari在302重定向後失敗CORS請求

  1. DomainA中承載一個頁面,這使得一個XHR請求DomainB中(Origin標設置爲DomainA中)
  2. DomainB中返回302重定向做DomainC(原點頭被設置爲null,這似乎是與RFC OK)
  3. DomainC返回與實際內容

此作品在Chrome中,FF 200響應,但它在Safari瀏覽器(在Mozilla/5.0(Macintosh的測試;英特爾的Mac OS X 10_10_5)未能爲AppleWebKit/600.8 .9(KHTML,如Gecko)Version/8.0.8 Safari/600.8.9)。

當我在沒有打開xhr.withCredentials的情況下發出請求時,首先,Safari在向DomainC發出實際請求之前發出OPTIONS預檢請求,因爲所有請求都是簡單請求,但我可以處理。問題是Safari在向DomainC發送預檢請求之後發生故障,表示「無法從null發出任何請求」。 我可以通過將Access-Control-Allow-Origin設置爲*並刪除Access-Control-Allow-Credentials頭(這些是互斥的)來繞過此操作,這將使此場景生效。但我仍然認爲這是不正確的行爲。現在

,事情是我需要的憑證由傳遞(也沒有,因爲它取決於一些第三方的服務器上,我不能將它傳遞一些其他的方式)。所以,讓我們設置

xhr.withCredentials

爲true,我們又回到了「不能讓從空的任何要求」,現在甚至通配符訪問控制允許的憑據沒有幫助。

我認爲所有CORS標頭設置正確,但請隨時檢查我。測試例如可以在這裏找到:http://a.ihatesafari.com

這到底是怎麼回事?這是一個錯誤還是我錯過了什麼?

感謝答案

+0

它甚至未能DomainA中做出一個XHR到DomainA中並重定向到DomainC的簡單的情況。 – hrdwdmrbl

回答

3

我遇到這個問題,以及發現this bug從2012年出現到被描述它。運行FF/Chrome/Safari中錯誤中引用的測試代碼只會導致Safari失敗。看來這個bug還沒有被修補。

最終解決這個問題,我修改我們的HTTP API添加一個可選的查詢參數觸發返回200 OK包含的URL,該客戶是遵循JSON體不同的反應。不幸的是,如果你是其他人的HTTP API的消費者,這將不會有多大幫助。

+0

我遇到了調用第三方API的這個問題。任何想法如何我可以解決這個問題? – elTomato

+0

如果您有自己的Web服務器/ API,則可以使用您在服務器上實現的調用來打包第三方API調用,該調用以Safari可以使用的方式運行。 – MisterG