[英]Valid Access-Control-Allow-Origin responses
這類似於jquery ajax add身份驗證標頭,因為它與相同的API相關,但這更多地是關於對OPTIONS請求的響應的有效值。
鑒於這種:
$.ajax({
url: "https://auspost.com.au/api/postcode/search.json?q=clayfield",
headers: {
'auth-key': '510839e3-****-****-****-6e04a56e9eb3'
}
}, function (data) {
var json = {
json: JSON.stringify(data)
};
console.log(json);
});
我得到這個回應:
Access-Control-Allow-Headers:accept, auth-key
Access-Control-Allow-Methods:GET
Access-Control-Allow-Origin:
Access-Control-Max-Age:1200
Connection:keep-alive
Content-Length:0
Date:Fri, 13 Feb 2015 03:46:42 GMT
Server:nginx
這會導致錯誤:“ Access-Control-Allow-Origin”標頭包含無效值“”,這表示不允許我的來源訪問。
服務器為Access-Control-Allow-Origin標頭返回一個空字符串(而不是我的來源或*)是否有效? 如果那是有效的,我該如何正確驗證我的請求?
“ Access-Control-Allow-Origin”標頭包含無效值,因為它在響應中為空白。 響應必須返回*
或原始的實際指定ASCII文本。
W3建議以下內容
資源可以定義一個Access-Control-Allow-Origin標頭。 標頭必須匹配以下ABNF:
Access-Control-Allow-Origin =“訪問控制-允許-起源”“:” ascii-origin | “*”
請參閱: http : //www.w3.org/TR/2008/WD-access-control-20080912/#access-control-allow-origin
正如其他人所建議的那樣,由服務器根據您提供的授權和來源來正確返回這些值。 也許,如果您不嘗試發送服務器值,服務器將不會返回無效響應。
**更新-2015/2/15 **
進一步研究后,我認為問題是服務器設置與目標服務器以及瀏覽器中的jquery / CORS進程結合在一起的。
在服務器級別似乎正在發生的是,如果AUTH-KEY不作為標頭值出現,則服務器被配置為在Access-Control-Allow-Origin
響應標頭中返回空字符串。 這不符合標准,但是有些人選擇此作為安全預防措施,以確保不會提出無效的CORS請求。
由於W3( http://www.w3.org/TR/cors/#preflight-request )定義的CORS的飛行前請求資源處理模型,此服務器行為會影響客戶端行為。和您的瀏覽器。
在實際請求中已正確設置請求頭中的AUTH-KEY之前,會生成預檢請求作為OPTION請求(代替GET),以便使服務器有機會告訴客戶端是否CORS策略和身份驗證將允許處理請求。
這些標准還規定,您提供的標頭實際上不會在此預檢請求中發送,而是轉換為稱為“ Access-Control-Request-Headers”的單個標頭值( http://www.w3.org/TR/cors /#http-access-control-request-headers )。 對於通過jquery的特定請求,您將看到以下標頭轉換:
Access-Control-Request-Headers: accept, auth-key
由於auth-key
沒有傳遞到服務器,並且如上所述,您的服務器不會對OPTION請求返回“有效”響應,因為此OPTION請求不包含您的實際AUTH-KEY標頭,而是Access-Control-Request-Headers
標頭,正是這個空的Access-Control-Response-Headers
響應在處理XMLHttpRequest時生成瀏覽器錯誤。
作為解決方案,我將嘗試在首選的服務器端頁面(PHP,.NET等)中設置本地服務器頁面,該頁面將執行簡單的服務器到服務器請求,然后對本地服務器使用ajax請求頁代理來解決上述CORS問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.