平常我们遇到跨域问题时,常使用 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相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]