平常我们遇到跨域问题时,常使用 cors(Cross-origin resource sharin)方式解决。不知你是否注意到,在设置响应头 Access-Control-Allow-Origin 域的值时,只允许设置一个域名,这意味着不能同时设置多个域名来共享资源。而在 Yii2 中直接使用'Origin' => ['http://www.site1.com', 'http://www.site2.com']
的形式却可以设置多个 cors 域名值,Why"text-align: center">
其实,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 http://www.fq.yii.com; add_header Access-Control-Allow-Origin http://www.d.yii.com;
接口 请求 和 响应头 如下:
Response Headers Access-Control-Allow-Origin: http://www.fq.yii.com Access-Control-Allow-Origin: http://www.d.yii.com 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: http://www.fq.yii.com Proxy-Connection: keep-alive ... ...
当前域为www.fq.yii.com
,需跨域请求http://api.d.fanhaobai.com/v1/config/list.json
的资源。浏览器抛出如下跨域错误:
XMLHttpRequest cannot load http://api.d.fanhaobai.com/v1/config/list.json. The 'Access-Control-Allow-Origin' header contains multiple values 'http://www.fq.yii.com, http://www.d.yii.com', but only one is allowed. Origin 'http://www.fq.yii.com' is therefore not allowed access.
以上信息明确说明,Access-Control-Allow-Origin 只能设置为一个值,即每次请求只能对应一个域名值。故通过该方法不能设置多域名进行 cors。
Yii2设置多域名
Yii2 设置多域名 cors,只需在对应控制器(ConfigController)中设置 cors 行为,如下:
class BaseController extends Controller { /** * @inheritdoc */ public function behaviors() { return [ 'corsFilter' => [ 'class' => \yii\filters\Cors::className(), 'cors' => [ //运行cors域名列表 'Origin' => ['http://www.d.yii.com', 'http://www.fq.yii.com'], 'Access-Control-Allow-Credentials' => true, ] ], ]; } }
重新在www.fq.yii.com
发送 cors 请求,发现此时已经不存在跨域问题。响应头 如下:
Access-Control-Allow-Credentials: true Access-Control-Allow-Origin: http://www.fq.yii.com Connection: keep-alive Content-Type: application/json; charset=UTF-8 ... ...
我们会发现,Access-Control-Allow-Origin 域的值为http://www.fq.yii.com
,刚好为当前域名一致,且只有一个值,并未出现设置的http://www.d.yii.com
值。
同时,在www.d.yii.com
下发送 cors 请求,也不存在跨域问题。响应头中 Access-Control-Allow-Origin 值为http://www.d.yii.com
。
由此可知,Yii2 在控制器行为中设置 Origin 项,只是一个域名白名单,而返回的 Access-Control-Allow-Origin 同请求的域名一致且在这个白名单中,这个 Access-Control-Allow-Origin 由 Yii2 根据当前请求所在域名进行了动态处理。
Yii2动态Access-Control-Allow-Origin
查看 Yii2 的\yii\filters\Cors
类源码,如下:
class Cors extends ActionFilter { /** * @var array CORS所用的响应头 */ 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' => [], ]; /** * 执行action前要做的事 * @inheritdoc */ public function beforeAction($action) { $this->request = $this->request "color: #ff0000">总结通过 Nginx 设置 Access-Control-Allow-Origin 进行 cors,有且只能有一个特定域名,局限性较大。通过代码逻辑操作 Access-Control-Allow-Origin 来实现 cors,则比较灵活,能解决多个域名进行 cors 的需求,但是如果接口异常,跨域设置则会失效。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]