2013-07-27 49 views
7

我正在嘗試使用jQuery.ajax()創建一個跨源GET請求。我的服務器被配置爲接受這樣的請求。 Chrome瀏覽器不會允許我發送頭:Webkit瀏覽器將不允許我設置CORS預檢標頭

訪問控制請求法

訪問控制請求報頭

拒絕設定不安全頭「訪問控制,請求 - 法」 < - 錯誤 消息

這裏是我的Ajax請求:

$.ajax({ 
    type:"GET", 
    headers: { 
     'Access-Control-Request-Method' : 'GET', 
     'Access-Control-Request-Headers': 'X-Custom' 
    },  
    url: "http://localhost:3000",  
    success: function(msg) { 
     console.log(msg); 
    } 
}); 

我在期待這些頭文件讓瀏覽器創建一個飛行前請求(OPTIONS)與服務器協商。我知道我之前完成了這項工作。有人能告訴我我忘了什麼嗎?

非常感謝!

+1

將'Access-Control-Expose-Headers'設置爲'x-json' – Ohgodwhy

+0

什麼?這不是我想發送的標題。你能否詳細說明一下? – Nick

+2

這是一種解決方法。您會發現,當您想要發出跨域請求時,就會建立預檢請求。預檢將檢查服務器的「OPTIONS」是否可用,並返回標題。在預檢完成之前,請求將無法在基於webkite的瀏覽器中解析,以避免發生跨站點僞造。 [您可以在這裏閱讀更多信息](https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS?redirectlocale=zh-CN&redirectslug=HTTP_access_control) – Ohgodwhy

回答

0

如果請求不是簡單的請求,則自動在一個跨域請求上發生PREFLIGHT選項請求。一個簡單的請求通常是一個GET請求。因此,如果您進行跨域GET請求,則不會有預檢OPTIONS請求。

但是,如果您進行跨域POST請求,則瀏覽器將在沒有您指示的情況下首先進行預檢OPTIONS請求。此請求的目的是查看服務器是否允許來自您客戶的域/ IP的跨域POST請求。

如果您的服務器在響應中具有正確的「訪問控制」標題,即表示允許此客戶端發出跨域POST請求,則瀏覽器將繼續發出POST請求。如果您的服務器表示否(因爲您的服務器上的「訪問控制」標題是錯誤的),那麼瀏覽器將尊重它,並且不會發出第二個POST請求。

有關更多信息,請參閱https://www.html5rocks.com/en/tutorials/cors/#toc-handling-a-not-so-simple-request

此外,您必須確保您的服務器設置爲處理傳入的OPTIONS請求。

相關問題