CORS是一种允许当前域(domain)的资源(比如html/js/web service)被其他域(domain)的脚本请求访问的机制,通常由于同域安全策略(the same-origin security policy)浏览器会禁止这种跨域请求。
CORS也有一些限制,两种模型可以实现:
1.简单模型
只支持getpost,不支持putdelete等,例如返回 Access-Control-Allow-Origin:*,但是不允许自定义header且会忽略cookies,且post数据格式有限制,只支持 ‘text/plain','application/x-www-urlencoded'and'multipart/form-data',其 中’text/plain'默认支持,后面两种需要下面的预检请求和服务器协商。
2.协商模型/预检请求(Preflighted Request)
举例:浏览器发出PUT请求,OPTION请求返回Access- Control-Allow-Origin:*,Access-Control-Allow-Methods:’PUT’,服务器同意所有域的PUT请 求,浏览器收到并继续发出真正的PUT请求,服务器响应并再次返回Access-Control-Allow-Origin:*,允许浏览器的脚本执行服 务器返回的数据。
地址 http://www.yiichina.com/doc/guide/2.0/structure-filters
yiifiltersCors
跨域资源共享 CORS 机制允许一个网页的许多资源(例如字体、JavaScript等) 这些资源可以通过其他域名访问获取。 特别是JavaScript's AJAX 调用可使用 XMLHttpRequest 机制,由于同源安全策略该跨域请求会被网页浏览器禁止. CORS定义浏览器和服务器交互时哪些跨域请求允许和禁止。
yiifiltersCors 应在 授权 / 认证 过滤器之前定义,以保证CORS头部被发送。
use yiifiltersCors;
use yiihelpersArrayHelper;
public function behaviors()
{
return ArrayHelper::merge([
[
'class' => Cors::className(),
],
], parent::behaviors());
}
Cors 可转为使用 cors
属性。
cors['Origin']
: 定义允许来源的数组,可为['*']
(任何用户) 或['http://www.myserver.net', 'http://www.myotherserver.com']
. 默认为['*']
.cors['Access-Control-Request-Method']
: 允许动作数组如['GET', 'OPTIONS', 'HEAD']
. 默认为['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS']
.cors['Access-Control-Request-Headers']
: 允许请求头部数组,可为['*']
所有类型头部 或['X-Request-With']
指定类型头部. 默认为['*']
.cors['Access-Control-Allow-Credentials']
: 定义当前请求是否使用证书,可为true
,false
或null
(不设置). 默认为null
.cors['Access-Control-Max-Age']
: 定义请求的有效时间,默认为86400
.
例如,允许来源为 http://www.myserver.net
和方式为 GET
, HEAD
和 OPTIONS
的CORS如下:
use yiifiltersCors;
use yiihelpersArrayHelper;
public function behaviors()
{
return ArrayHelper::merge([
[
'class' => Cors::className(),
'cors' => [
'Origin' => ['http://www.myserver.net'],
'Access-Control-Request-Method' => ['GET', 'HEAD', 'OPTIONS'],
],
],
], parent::behaviors());
}
可以覆盖默认参数为每个动作调整CORS 头部。例如,为login
动作增加Access-Control-Allow-Credentials
参数如下所示:
use yiifiltersCors;
use yiihelpersArrayHelper;
public function behaviors()
{
return ArrayHelper::merge([
[
'class' => Cors::className(),
'cors' => [
'Origin' => ['http://www.myserver.net'],
'Access-Control-Request-Method' => ['GET', 'HEAD', 'OPTIONS'],
],
'actions' => [
'login' => [
'Access-Control-Allow-Credentials' => true,
]
]
],
], parent::behaviors());
}