版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 景區(qū)運(yùn)營(yíng)管理師安全培訓(xùn)效果評(píng)優(yōu)考核試卷含答案
- 人力資源外包保障機(jī)制-洞察與解讀
- 傳感材料在床品中的應(yīng)用-洞察與解讀
- 印刷數(shù)據(jù)分析應(yīng)用-洞察與解讀
- 中藥智能提取-洞察與解讀
- 門(mén)診醫(yī)保管理制度
- 公司環(huán)境風(fēng)險(xiǎn)防范管理制度
- 醫(yī)院血液管理流程及申請(qǐng)制度
- 企業(yè)員工職業(yè)道德培訓(xùn)講義及心得體會(huì)
- 幼兒園端午節(jié)主題活動(dòng)教案設(shè)計(jì)
- 安全生產(chǎn)目標(biāo)及考核制度
- (2026版)患者十大安全目標(biāo)(2篇)
- 2026年北大拉丁語(yǔ)標(biāo)準(zhǔn)考試試題
- 臨床護(hù)理操作流程禮儀規(guī)范
- 2025年酒店總經(jīng)理年度工作總結(jié)暨戰(zhàn)略規(guī)劃
- 空氣栓塞課件教學(xué)
- 2025年國(guó)家市場(chǎng)監(jiān)管總局公開(kāi)遴選公務(wù)員面試題及答案
- 肌骨康復(fù)腰椎課件
- 患者身份識(shí)別管理標(biāo)準(zhǔn)
- 2025年10月自考04184線(xiàn)性代數(shù)經(jīng)管類(lèi)試題及答案含評(píng)分參考
- 2025年勞動(dòng)保障協(xié)理員三級(jí)技能試題及答案
評(píng)論
0/150
提交評(píng)論