我在 error.php 中有以下代码,它是在我的控制器中使用
App::abort(404, $error)
触发的。我的响应状态代码仍然是 200(ok)。我尝试了各种错误代码,例如 400、403
// NotFoundException handler
App::error(function(NotFoundException $e)
{
$default_message = 'The requested resource was not found';
return Response::json(array(
'error' => $e->getMessage() ?: $default_message,
), 404);
});
对于仍在谷歌搜索此问题的任何人:
我在这个问题上苦苦挣扎了几个小时。对我来说,问题是由我的一个控制器的问题引起的。
检查所有控制器并确保
<?php
标签前面没有空格。 <?php
标签应该是文件中的第一件事。在任何这样路由的控制器中,<?php
标签前面的一个空格:
Route::controller('example', 'ExampleController');
将导致所有状态代码为 200.
我相信,无论如何,您应该收到 404 响应,因此可能会发生其他事情,这是您的问题中未包含代码的结果。
也就是说,为 404 抛出的异常类是
NotFoundHttpException
而不是 NotFoundException
。
由于 Laravel 4 使用 Symfony 的 HttpKernal,所以异常是here.
你可以看到 here 当 404 被触发时
App::abort()
抛出 NotFoundHttpException
。
因此,您的代码应该如下所示:
// NotFoundHttpException handler
App::error(function(\Symfony\Component\HttpKernel\Exception\NotFoundHttpException $e)
{
$default_message = 'The requested resource was not found';
return Response::json(array(
'error' => $e->getMessage() ?: $default_message,
), 404);
});
重要:这只会触发 404 状态,因为这是与 NotFoundHttpException 对应的代码。其他状态代码返回其他异常类。要捕获 all HTTP 状态错误代码异常,请为 HttpException 键入提示,如下所示:
// HttpException handler
App::error(function(\Symfony\Component\HttpKernel\Exception\HttpException $e)
{
return Response::json(array(
'error' => $e->getMessage(),
), $e-> getStatusCode());
});
解决方案对我不起作用,所以如果有人仍在寻找答案,我认为最好把它放在这里而不是创建另一个问题。
一段时间后我也遇到了这个问题,在我的
app/Exceptions/Handler.php
中我有:
if ($e instanceof ModelNotFoundException) {
if ($request->ajax()) {
return response()
->json(['error' => ['No results']])
->header('status', 422);
}
}
这在我的本地环境中有效,但是,在同源环境(重现生产环境,只是为了清楚)它没有返回正确的状态代码。
再看一遍我开始看 Laravel 的文档,我将调用更改为以下内容:
return response()
->json(['error' => ['No results.']], 422);
这就成功了。希望这能有所帮助。
就我而言,我在前面找到了一些空间
dump
和其他打印功能注意到这个问题时,我正在积极调试。是因为我当时在代码里调用了
dump(...)
当我删除所有调试
dump
调用时,状态代码再次正确 404
(使用 abort(404
)。
我刚刚花了两天时间试图解决一个类似的问题:无论我试图通过服务器响应发送什么标头或状态代码,我总是会得到一个状态代码 200,默认内容类型为 text/html。 Laravel sanctum 的 csrf-cookie 不起作用。
我的问题是由 laravel 配置文件顶部的换行符引起的。
示例代码:
`
//<--- \n
<?php
return [
...
];
`
为了找到罪魁祸首文件,在 vscode 中,我对项目的所有文件使用了正则表达式搜索: +(
knows12 的原始答案对解决我的问题非常有用,谢谢。