首页 > 解决方案 > Yii2 上 beforeSend 修改 statusCode 为 200,但是浏览器接受 statusCode 仍然是 500

问题描述

我通过 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但它确实如此。我不明白。500response['data']['data]200

标签: phpyii2

解决方案


你不应该使用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 缓存以及可能更多,因为 200 和 302 不是唯一的非错误状态代码。


推荐阅读