Yii2在beforeSend上将statusCode修改为200,但浏览器接受statusCode仍然是500

时间:2018-07-07 03:14:09

标签: php yii2

我控制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。我不明白。

1 个答案:

答案 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并不是唯一的非错误状态代码。