我控制Yii2 RBAC的API访问。我想始终将200
作为状态代码返回403
。因此,我在main.php
的响应配置中添加了一些代码:
'components' => [
'response' => [
'class' => 'yii\web\Response',
'on beforeSend' => function ($event) {
$response = $event->sender;
if ($response->statusCode !== 200 && $response->statusCode !== 302) {
$response->data = Array(
'success' => $response->isSuccessful,
'data' => \Yii::$app->response->statusCode
);
\Yii::$app->response->statusCode = 200;
die(json_encode($response));
}
},
],
我将用户设置为不允许访问/test/list
。然后,我尝试由该用户访问/test/list
。我认为我应该收到HTTP状态代码200
,但是它是500
,而response['data']['data]
是200
。我不明白。
答案 0 :(得分:3)
您不应使用die()
。它将中断框架流程,并且永远不会发送您的响应。如果要发送JSON,则只需更改响应格式:
'response' => [
'class' => Response::class,
'on beforeSend' => function ($event) {
/* @var $response Response */
$response = $event->sender;
if ($response->statusCode !== 200 && $response->statusCode !== 302) {
$response->data = [
'success' => $response->isSuccessful,
'data' => $response->statusCode
];
$response->statusCode = 200;
$response->format = Response::FORMAT_JSON;
}
},
],
但是请注意,错误返回状态200可能会带来意外的副作用。例如,不存在的页面将被网络蜘蛛索引为常规页面,因此搜索结果中可能包含此类错误JSON。 在当前状态下,它还会破坏永久重定向(301),HTTP caching甚至更多,因为200和302并不是唯一的非错误状态代码。