2013-01-24 29 views
13

我試圖將簡單的CORS請求發送到使用會話密鑰進行授權的外部應用程序服務器。CORS請求在Chrome中僅在有頭文件時失敗

$.ajax({ 
    type: "GET", 
    url: "https://192.168.1.72:8442/api/file/", 
    headers: {"Authorization": "3238562439e44fcab4036a24a1e6b0fb"} 
}); 

它工作正常,在Firefox 18,歌劇12.12和Rekonq 2.0(也Webkit使用),但在谷歌瀏覽器無法正常工作(試過版本21和24)。在Google Chrome瀏覽器中,它顯示OPTIONS資源無法在Network Inspector中加載,並且應用程序服務器未收到任何請求。我試過jQuery 1.8.3和1.9.0。

Request URL:https://192.168.1.72:8442/api/file/ 
Request Headers 
Access-Control-Request-Headers:accept, authorization, origin 
Access-Control-Request-Method:GET 
Cache-Control:no-cache 
Origin:https://192.168.1.72:8480 
Pragma:no-cache 

如果我刪除從請求頭,然後我收到401也是在谷歌Chrome和它能夠訪問資源的授權的情況下,應用程序服務器上被禁用。發送哪個頭文件無關緊要。只能發送的標題是{「Content-Type」:「plain/text」}。所有其他標題名稱/值都會在Google Chrome中發生錯誤,但可以在我上面提到的所有瀏覽器中使用。

爲什麼谷歌瀏覽器在CORS請求中不處理標題?

+1

嘗試'authorization'具有共同'了' – Musa

+0

@Musa:仍然相同。 –

+0

你能列出OPTIONS請求的請求和響應頭嗎?服務器應該響應以下內容: 'Access-Control-Allow-Origin:*' 'Access-Control-Allow-Methods:GET,PUT,POST,DELETE' 'Access-Control-Allow-Headers:accept ,授權,起源' – monsur

回答

1

服務器端: 服務器應設置頁眉「訪問控制允許的憑據」,並設置「訪問控制允許報頭」所允許的頭。

客戶端:您可以在$ .ajax()中設置xhrFields,而不是顯式傳遞Auth頭。

xhrFields: { 
    withCredentials: true 
} 

更多詳細信息here

+0

withCredentials似乎用於cookie或基本身份驗證。我只想在Chrome中獲取請求標題。 –

2

我在我的api服務器上使用自簽名證書,這似乎是問題。我發現如果我使用--disable-web-security選項啓動谷歌瀏覽器,則帶請求標頭的CORS正在工作。沒有--disable-web-security我可以發送CORS請求到自簽名api服務器,但不能添加任何標題(Content-Type除外)。

+0

連接到另一個域的一個域(都使用http)會發生同樣的問題。您的--disable-web-security選項也修復了這種情況。我相信* * bug是特定於EventSource的,並且可能在Chrome 26中得到修復。然而'--disable-web-security'沒有解決自簽名證書HTTPS問題(無論是使用EventSource還是XMLHttpResponse),至少不會在Chrome 25中。 –

2

我發現Access-Control-Allow-Headers:*只能設置爲「OPTIONS」請求。 如果您退貨,POST請求,那麼瀏覽器取消該請求(至少鉻)

下面的PHP代碼對我的作品

// Allow CORS 
header("Access-Control-Allow-Origin: *"); 
header('Access-Control-Allow-Credentials: true');  
header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); 

// Access-Control headers are received during OPTIONS requests 
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { 
    header("Access-Control-Allow-Headers: *"); 
} 

我發現了一些誤導性的反應類似的問題: - 服務器線程說這是2年鉻的bug:Access-Control-Allow-Headers與localhost不匹配。這是錯誤的:我可以使用CORS到我的本地服務器,通常Post是 - Access-Control-Allow-Headers確實接受通配符。這也是錯誤的,通配符適用於我(我只通過Chrome測試)

這花了我半天的時間來找出問題。

快樂編碼

+0

這篇文章的第一句救了我。謝謝! – Jonah

相關問題