問題簡介:在我發(fā)送post請求之前疹蛉,瀏覽器總是會多發(fā)送一個option請求,而由于我們的Nginx服務(wù)器直接屏蔽了options請求,導(dǎo)致options請求失敗嗡害,進而導(dǎo)致后面的請求無法發(fā)送。
我們都知道請求分為同源請求和跨源請求畦攘,而我們常用的AJAX只能用于同源請求霸妹,要想跨域,我們可以使用JSONP念搬,CORS抑堡, WebSocket來實現(xiàn)。本文主要來帶大家簡單了解下CORS朗徊。
CORS是跨域資源共享(Cross-origin resource sharing)的簡稱
CORS請求需要瀏覽器和服務(wù)端同時支持首妖。
CORS的請求分為簡單請求和非簡單請求兩類。
簡單請求
被稱為簡單請求的條件:
(1) 請求方法是以下三種方法之一:
HEAD
GET
POST
(2)HTTP的頭信息不超出以下幾種字段:
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type:只限于三個值application/x-www-form-urlencoded爷恳、multipart/form-data有缆、text/plain
對于簡單請求,瀏覽器會在其請求頭部中增加一個Origin字段,
Orgin: http://example.com:10000
來說明這個請求來自哪個源(即請求來自哪里棚壁,協(xié)議+域名+端口)杯矩,當(dāng)服務(wù)器收到這個請求,會查看請求的origin字段袖外,根據(jù)源來判斷是否允許該跨域請求史隆。
若允許,則會在返回的頭部信息中加上:
Access-Control-Allow-Origin: http://example.com:10000
該字段表示該跨域請求被允許曼验。
若不允許泌射,也會正常返回一個HTTP Response,但是Header中不包括此字段鬓照。這時瀏覽器收到后就會知道請求失斎劭帷(即使HTTP回應(yīng)的狀態(tài)碼是200)。
非簡單請求
不符合簡單請求要求的被稱為非簡單請求豺裆。
對于非簡單請求拒秘,會在真正請求之前先發(fā)送一個options請求,稱之為預(yù)請求臭猜,這就是為什么我們在開發(fā)的時候明明沒有發(fā)送過什么options類型的請求卻經(jīng)程删疲看到的原因。預(yù)請求的作用是用來詢問后面真正的請求是否被許可获讳,預(yù)請求很簡單阴颖,有三個主要的字段:
origin: http://example.com:10000
Access-Control-Request-Method: post
Access-Control-Request-Headers: auth-token
分別表示請求的源活喊,真正請求的方式丐膝,真正請求的額外頭信息字段(多個用逗號分開),服務(wù)器端收到預(yù)請求后钾菊,會檢查這三個字段帅矗,確認允許后會在頭部返回如下信息:
Access-Control-Allow-Origin: http://example.com:10000
Access-Control-Allow-Methods: get, post, put, delete
Access-Control-Allow-Headers: auth-token
如沒有這三個字段,則表示不允許后面真正的請求煞烫,則瀏覽器不會繼續(xù)發(fā)送真正的請求浑此;有則表示允許,被允許后滞详,則會像發(fā)送簡單請求那樣發(fā)送真正的請求凛俱。
參考鏈接
同源政策及其避規(guī)方法 http://www.ruanyifeng.com/blog/2016/04/same-origin-policy.html
CORS詳解 http://www.ruanyifeng.com/blog/2016/04/cors.html