Yii2:如何允许在非restfull API上使用CORS
我正在使用Yii2 Framework上的预构建API(不是restfull)。它响应JSON数据并接受取决于用户类型和凭证令牌的请求。现在我必须创建一个位于不同位置(域)的应用程序,这会导致CORS冲突。Yii2:如何允许在非restfull API上使用CORS
我的应用程序是jQuery,我使用$.ajax
进行数据发送和接收。 我该如何避免这种CORS冲突,并通过ajax使用API?
问候
UPDATE:
由于IStranger告诉我,在他的回答,我添加以下代码:
public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['corsFilter'] = [
'class' => \yii\filters\Cors::className(),
'cors' => [
'Origin' => "*",
'Access-Control-Request-Method' => ['POST', 'GET'],
'Access-Control-Allow-Credentials' => true,
'Access-Control-Max-Age' => 3600,
],
];
return $behaviors;
}
但我仍然得到错误。在代码中有一个beforeAction
可以是一个问题?
这是RAW头
请求:
Host: domain.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://localhost/main/main.html
Content-Length: 296
Origin: http://localhost
Connection: keep-alive
响应:
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection: Keep-Alive
Content-Length: 101
Content-Type: application/json; charset=UTF-8
Date: Thu, 22 Sep 2016 17:23:48 GMT
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive: timeout=5, max=100
Pragma: no-cache
Server: Apache/2.4.17 (Win64) PHP/5.6.16
Set-Cookie: PHPSESSID=ph0b322gbq65m1f3m8fp9fphc0; path=/; HttpOnly
X-Powered-By: PHP/5.6.16
只需添加到您的API控制器:
/**
* List of allowed domains.
* Note: Restriction works only for AJAX (using CORS, is not secure).
*
* @return array List of domains, that can access to this API
*/
public static function allowedDomains()
{
return [
// '*', // star allows all domains
'http://test1.example.com',
'http://test2.example.com',
];
}
/**
* @inheritdoc
*/
public function behaviors()
{
return array_merge(parent::behaviors(), [
// For cross-domain AJAX request
'corsFilter' => [
'class' => \yii\filters\Cors::className(),
'cors' => [
// restrict access to domains:
'Origin' => static::allowedDomains(),
'Access-Control-Request-Method' => ['POST'],
'Access-Control-Allow-Credentials' => true,
'Access-Control-Max-Age' => 3600, // Cache (seconds)
],
],
]);
}
此代码将增加反应规范al http-headers。请求http头部应该有Origin
(它将由Crossdomain AJAX自动添加到浏览器中)。响应http标头应该有Access-Control-*
标头。
注意:如果您没有看到这些http标题作为回应,可能意味着\yii\filters\Cors
不起作用。检查控制器中的其他行为/过滤器。尝试禁用CSRF验证该控制器(可以防止外部访问):
/**
* Controller for API methods.
*/
class ApiController extends Controller
{
/**
* @var bool See details {@link \yii\web\Controller::$enableCsrfValidation}.
*/
public $enableCsrfValidation = false;
// ...
}
UPD:另外应检查你的web服务器。可能nginx可能需要额外的配置,Apache可能需要重新启动。
UPD2:更完整的指令位置:https://*.com/a/42435695/3793592
我在编辑有关您的答案的问题请参阅。 –
我已经禁用了CSRF。 –
我重新启动了Apache并运行。我猜apache的缓存或什么使问题持续存在。 –
尝试更换' '起源'=> [ “*”],'。 然后使用浏览器调试器(“网络”选项卡)检查AJAX请求的http头。请求标头应该有'Origin'值,并且响应标头应该有'Access-Control-Allow-Credentials'和'Access-Control-Allow-Origin'。 – IStranger
@ISTRANK确定工作,但现在我得到一个500错误,但与请求类型的选项,因为我在发布 –
@ISTRAGER忽略我的最后一条评论,它仍然无法正常工作。 –