php - 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
但它确实如此。我不明白。500
response['data']['data]
200
解决方案
你不应该使用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 不是唯一的非错误状态代码。
推荐阅读
- web-scraping - 这个网络爬虫我做错了什么?
- python - 递归矩形细分
- r - gtsummary 修改后的交叉表
- c# - Entity Framework Core 和 ASP.NET Core Web API 连接字符串:如何删除两个地方的连接字符串?
- react-native - 如何使 react-native-raw-bottom-sheet 成为可重用的组件?
- sql - SQL 数据库不保存
- java - 通过 documentID 获取多个特定的 FireStore 文档
- python - 溢出错误:int 太大而无法转换为浮点数
- python - 时间戳与 Firestore 和 Postman 不同
- c++ - 将 boost/文件系统转换为字符串