平常我們遇到跨域問題時,常使用 cors(cross-origin resource sharin)方式解決。不知你是否注意到,在設定響應頭 access-control-allow-origin 域的值時,只允許設定乙個網域名稱,這意味著不能同時設定多個網域名稱來共享資源。而在 yii2 中直接使用'origin' => ['', '']的形式卻可以設定多個 cors 網域名稱值,why?
其實,yii2 中採用了動態設定 access-control-allow-origin 域值的方法來解決這個問題。
說明:測試使用的介面網域名稱api.d.fanhaobai.com,cros 多網域名稱為www.d.yii.com和www.fq.yii.com。nginx設定多網域名稱
嘗試直接通過 nginx 的add_header模組追加 access-control-allow-origin 值實現,如下:
add_header access-control-allow-origin
add_hea access-control-allow-origin
介面 請求 和 響應頭 如下:
response headers
access-control-allow-origin:
access-control-allow-origin:
connection: keep-alive
content-type: application/json; charset=utf-8
... ...
request headers
accept: */*
accept-encoding: gzip, deflate
accept-language: zh-cn,zh;q=0.8
host: api.d.fanhaobai.com
origin:
proxy-connection: keep-alive
... ...
當前域為www.fq.yii.com,需跨域請求的資源。瀏覽器丟擲如下跨域錯誤:
以上資訊明確說明www.cppcns.com,access-control-allow-origin 只能設定為乙個值,即每次請求只能對應乙個網域名稱值。故通過該方法不能設定多網域名稱進行 cors。
yii2設定多網域名稱
yii2 設定多網域名稱 cors,只需在對應控制器(configcontroller)中設定 cors 行為,如下:
class basecontroller extends controller
}重新在www.fq.yii.com傳送 cors 請求,發現此時已經不存在跨域問題。響應頭 如下:
access-control-allow-credentials: true
access-control-allow-origin:
connection: keep-alive
content-type: application/json; charset=utf-8
... ...
我們會發現,access-control-allow-origin 域的值為,剛好為當前網域名稱一致,且只有乙個值,並未出現設定的值。
同時,在www.d.yii.com下傳送 cors 請求,也不存在跨域程式設計客棧問題。響應頭中 access-control-allow-origin 值為。
由此可知,yii2 在控制器行為中設定 origin 項,只是乙個網域名稱白名單,而返回的 access-control-allow-origin 同請求的網域名稱一致且在這個白名單中,這個 access-control-allow-origin 由 yii2 根據當前請求所在網域名稱進行了動態處理。
yii2動態access-control-allow-origin
檢視 yii2 的\yii\filters\cors類原始碼,如下:
class cors extends actionfilter
/*** 處理cors所用的響應頭,動態處理access-control-allow-origin域
* @param array $requestheaders cors headers we h**e detected
* @return array cors headers ready to be sent
*/public function prepareheaders($requestheaders)
}... ...}}
主要思想就是,檢視源位址是否在 cors 白名單中,在則設定 access-control-allow-origin 域的值為源位址。這樣就能滿足 access-control-allow-origin 為乙個值的限制,同時也能允許指定的網域名稱進行 cors。
注意:使用該方法請確保 nginx 配置中未操作 access-control-allow-origin 域。總結
通過 nginx 設定 access-control-allow-origin 進行 cors,有且只能有乙個特定xkahausyu網域名稱,侷限性較大。通過**邏輯操作 access-control-allow-origin 來實現 cors,則比較靈活,能解決多個網域名稱進行 cors 的需求,但是如果介面異常,跨域設定則會失效。
本文標題: yii支援多網域名稱cors原理的實現
本文位址:
yii2 高階版 多版本支援
1,在 common config bootstrap.php 下,增加別名,指向到對應的資料夾,例如 yii setalias test v1 dirname dirname dir test v1 yii setalias test v2 dirname dirname dir test v2 ...
Yii2 多網域名稱跨域同步登入退出
在平台開發過程中,專案分為前台 frontend www.com和後台 backend yun.com兩部分,繫結兩個網域名稱,我們知道在沒有繫結網域名稱的時候前後臺可以同步登入和退出,但是繫結網域名稱後就失效了,原因是session的作用域不同了。兩個網域名稱的session作用域都只限制在了自己...
springboot2 0 對CORS的支援
先自定義乙個配置類 package com.springboot2.thyemleaf.configuration import org.springframework.context.annotation.bean import org.springframework.context.annota...