Yii支持多域名cors原理的實(shí)現(xiàn)_第1頁(yè)
Yii支持多域名cors原理的實(shí)現(xiàn)_第2頁(yè)
Yii支持多域名cors原理的實(shí)現(xiàn)_第3頁(yè)
Yii支持多域名cors原理的實(shí)現(xiàn)_第4頁(yè)
Yii支持多域名cors原理的實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第Yii支持多域名cors原理的實(shí)現(xiàn)平常我們遇到跨域問(wèn)題時(shí),常使用cors(Cross-originresourcesharin)方式解決。不知你是否注意到,在設(shè)置響應(yīng)頭Access-Control-Allow-Origin域的值時(shí),只允許設(shè)置一個(gè)域名,這意味著不能同時(shí)設(shè)置多個(gè)域名來(lái)共享資源。而在Yii2中直接使用'Origin'=['','']的形式卻可以設(shè)置多個(gè)cors域名值,Why

其實(shí),Yii2中采用了動(dòng)態(tài)設(shè)置Access-Control-Allow-Origin域值的方法來(lái)解決這個(gè)問(wèn)題。

說(shuō)明:測(cè)試使用的接口域名,cros多域名為和。

Nginx設(shè)置多域名

嘗試直接通過(guò)Nginx的add_header模塊追加Access-Control-Allow-Origin值實(shí)現(xiàn),如下:

add_headerAccess-Control-Allow-Origin;

add_headerAccess-Control-Allow-Origin;

接口請(qǐng)求和響應(yīng)頭如下:

ResponseHeaders

Access-Control-Allow-Origin:

Access-Control-Allow-Origin:

Connection:keep-alive

Content-Type:application/json;charset=UTF-8

......

RequestHeaders

Accept:*/*

Accept-Encoding:gzip,deflate

Accept-Language:zh-CN,zh;q=0.8

Host:

Origin:

Proxy-Connection:keep-alive

......

當(dāng)前域?yàn)?,需跨域?qǐng)求/v1/config/list.json的資源。瀏覽器拋出如下跨域錯(cuò)誤:

XMLHttpRequestcannotload/v1/config/list.json.The'Access-Control-Allow-Origin'headercontainsmultiplevalues',',butonlyoneisallowed.Origin''isthereforenotallowedaccess.

以上信息明確說(shuō)明,Access-Control-Allow-Origin只能設(shè)置為一個(gè)值,即每次請(qǐng)求只能對(duì)應(yīng)一個(gè)域名值。故通過(guò)該方法不能設(shè)置多域名進(jìn)行cors。

Yii2設(shè)置多域名

Yii2設(shè)置多域名cors,只需在對(duì)應(yīng)控制器(ConfigController)中設(shè)置cors行為,如下:

classBaseControllerextendsController

*@inheritdoc

publicfunctionbehaviors()

return[

'corsFilter'=[

'class'=\yii\filters\Cors::className(),

'cors'=[

//運(yùn)行cors域名列表

'Origin'=['',''],

'Access-Control-Allow-Credentials'=true,

}

重新在發(fā)送cors請(qǐng)求,發(fā)現(xiàn)此時(shí)已經(jīng)不存在跨域問(wèn)題。響應(yīng)頭如下:

Access-Control-Allow-Credentials:true

Access-Control-Allow-Origin:

Connection:keep-alive

Content-Type:application/json;charset=UTF-8

......

我們會(huì)發(fā)現(xiàn),Access-Control-Allow-Origin域的值為,剛好為當(dāng)前域名一致,且只有一個(gè)值,并未出現(xiàn)設(shè)置的值。

同時(shí),在下發(fā)送cors請(qǐng)求,也不存在跨域問(wèn)題。響應(yīng)頭中Access-Control-Allow-Origin值為。

由此可知,Yii2在控制器行為中設(shè)置Origin項(xiàng),只是一個(gè)域名白名單,而返回的Access-Control-Allow-Origin同請(qǐng)求的域名一致且在這個(gè)白名單中,這個(gè)Access-Control-Allow-Origin由Yii2根據(jù)當(dāng)前請(qǐng)求所在域名進(jìn)行了動(dòng)態(tài)處理。

Yii2動(dòng)態(tài)Access-Control-Allow-Origin

查看Yii2的\yii\filters\Cors類(lèi)源碼,如下:

classCorsextendsActionFilter

*@vararrayCORS所用的響應(yīng)頭

public$cors=[

'Origin'=['*'],

'Access-Control-Request-Method'=['GET','POST','PUT','PATCH','DELETE','HEAD','OPTIONS'],

'Access-Control-Request-Headers'=['*'],

'Access-Control-Allow-Credentials'=null,

'Access-Control-Max-Age'=86400,

'Access-Control-Expose-Headers'=[],

*執(zhí)行action前要做的事

*@inheritdoc

publicfunctionbeforeAction($action)

$this-request=$this-request:Yii::$app-getRequest();

$this-response=$this-response:Yii::$app-getResponse();

......

$requestCorsHeaders=$this-extractHeaders();

//獲取cors所用的響應(yīng)頭

$responseCorsHeaders=$this-prepareHeaders($requestCorsHeaders);

//設(shè)置cors所用的響應(yīng)頭

$this-addCorsHeaders($this-response,$responseCorsHeaders);

returntrue;

*處理cors所用的響應(yīng)頭,動(dòng)態(tài)處理Access-Control-Allow-Origin域

*@paramarray$requestHeadersCORSheaderswehavedetected

*@returnarrayCORSheadersreadytobesent

publicfunctionprepareHeaders($requestHeaders)

$responseHeaders=[];

//$requestHeaders['Origin']為源地址,請(qǐng)求所在域名

if(isset($requestHeaders['Origin'],$this-cors['Origin'])){

//源地址在白名單中,則設(shè)置Access-Control-Allow-Origin為源地址

if(in_array('*',$this-cors['Origin'])||in_array($requestHeaders['Origin'],$this-cors['Origin'])){

$responseHeaders['Access-Control-Allow-Origin']=$requestHeaders['Origin'];

......

}

主要思想就是,查看源地址是否在cors白名單中,在則設(shè)置Access-Control-Allow-Origin域的值為源地址。這樣就能滿(mǎn)足Access-Control-Allow-Origin為一個(gè)值的限制,同時(shí)也能允許指定的域名進(jìn)行cors。

注意:使用該方法請(qǐng)確保Nginx配置中未操作Access-Control-Allow-Origin域。

總結(jié)

通過(guò)N

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論