Yii支持多域名克-奥二氏分级量表原理的实现
平常我们遇到跨域问题时,常使用跨来源资源共享方式解决。不知你是否注意到,在设置响应头访问控制允许来源域的值时,只允许设置一个域名,这意味着不能同时设置多个域名来共享资源。而在Yii2中直接使用Origin'=['http://www.site1.com ',' http://www.site2.com']的形式却可以设置多个克-奥二氏分级量表域名值,为什么?
其实,Yii2中采用了动态设置访问控制允许来源域值的方法来解决这个问题。
说明:测试使用的接口域名api.d.fanhaobai.com,cro多域名为www.d.yii.com和www.fq.yii.com。Nginx设置多域名
尝试直接通过Nginx的add_header模块追加访问控制允许来源值实现,如下:
add_header访问控制-允许-起源http://www.fq.yii.com;add_header访问控制-允许-起源http://www.d.yii.com;接口请求和响应头如下:
响应头访问-控制-允许-原始: http://。FQ。咦。com访问-控制-允许-原始: http://。迪伊。com连接: keep-aliveContent-type :应用/JSON;字符集=UTF-8.请求头接受: */*接受-编码: gzip,pinceaccept-语言: zh-CN,zh;q=0.8主机: API。樊浩白。Comoorigin : http://www。FQ。咦。压缩连接:保活.当前域为www.fq.yii.com,需跨域请求http://api.d.fanhaobai.com/v1/config/list.json的资源。浏览器抛出如下跨域错误:
XMLHttpRequest无法加载http://api.d.fanhaobai.com/v1/config/list.json."访问控制-允许-原始"标头包含多个值“http://www.fq.yii.com,http://www.d.yii.com”,但只允许一个值。因此,Origin 'http://www.fq.yii.com '不允许访问。
以上信息明确说明,访问控制-允许-来源只能设置为一个值,即每次请求只能对应一个域名值。故通过该方法不能设置多域名进行科尔。
Yii2设置多域名
Yii2设置多域名科尔,只需在对应控制器(配置控制器)中设置克-奥二氏分级量表行为,如下:
基于类的控制器扩展了控制器{/* * * @ inhardoc */公共函数行为(){返回[' CORS过滤器'=['类'=\ yii \ filters \ CORS 3360:类名(),' cors'=[ //运行克-奥二氏分级量表域名列表Origin'=['http://www.d.yii.com ',' http://www.fq.yii.com'],'访问控制-允许-凭据=true,] ],];}}重新在www.fq.yii.com发送克-奥二氏分级量表请求,发现此时已经不存在跨域问题。响应头如下:
访问控制允许凭证3360真实访问控制允许来源: http://www。FQ。咦。com连接: keep-aliveContent-type :应用/JSON;字符集=UTF-8.我们会发现,访问控制-允许-来源域的值为http://www.fq.yii.com,刚好为当前域名一致,且只有一个值,并未出现设置的http://www.d.yii.com值。
同时,在www.d.yii.com下发送克-奥二氏分级量表请求,也不存在跨域问题。响应头中访问控制允许来源值为http://www.d.yii.com。
由此可知,Yii2在控制器行为中设置起源项,只是一个域名白名单,而返回的访问控制允许来源同请求的域名一致且在这个白名单中,这个访问控制允许来源由Yii2根据当前请求所在域名进行了动态处理。
Yii2动态访问控制允许来源
查看Yii2的\ yii \筛选器\Cors类源码,如下:
克-奥二氏分级量表类扩展了ActionFilter{ /** * @var数组克-奥二氏分级量表所用的响应头*/public $ CORS=[' Origin '=[' *],' Access-Control-Request-Method '=[' GET ',' POST ',' PUT ',' PATCH ',' DELETE ',' HEAD ',' OPTIONS ',' Access-Control-Request-heads '=[' *],' Access-Control-Allow-Credentials '=null,' Access-Control-Max-Age'=86400,' Access-Control-Expose-heads '=[],];/** * 执行行为前要做的事* @ inheritadoc */action前的公共函数($ action){ $ this-request=$ this-request? yii : $ app-GetRequest();$this-response=$this-response? yii : $ app-GetResponse();$ request corsheiders=$ this-extract headers();//获取克-奥二氏分级量表所用的响应头$ responseCorsHeaders=$ this-准备头($ request corsheders);//设置克-奥二氏分级量表所用的响应头$ this-addcorsheeders($ this-response,$ response corheaders);返回真;} /** * 处理克-奥二氏分级量表所用的响应头,动态处理访问控制允许来源域* @param数组$requestHeaders我们检测到克-奥二氏分级量表头* @返回准备发送的数组克-奥二氏分级量表头*/公共函数准备头($请求头){ $ responseHeaders=[];//$requestHeaders['Origin']为源地址,请求所在域名if(isset($请求头[' Origin '],$ this-CORS[' Origin ']){//源地址在白名单中,则设置访问控制允许来源为源地址if (in_array('* ',$ this-CORS[' Origin '])| | in _ array($请求头[' Origin '],$ this-CORS[' Origin ']){ $ responseHeaders[' Access-Control-Allow-Origin ']=$请求头[' Origin '];} } .}}主要思想就是,查看源地址是否在克-奥二氏分级量表白名单中,在则设置访问控制允许来源域的值为源地址。这样就能满足访问控制允许来源为一个值的限制,同时也能允许指定的域名进行科尔。
注意:使用该方法请确保Nginx配置中未操作访问控制允许来源域。总结
通过Nginx设置访问控制允许来源进行科尔,有且只能有一个特定域名,局限性较大。通过代码逻辑操作访问控制允许来源来实现科尔,则比较灵活,能解决多个域名进行克-奥二氏分级量表的需求,但是如果接口异常,跨域设置则会失效。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
版权声明:Yii支持多域名克-奥二氏分级量表原理的实现是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。