[英]Laravel 4 always returns HTTP status code 200
我在 error.php 中有以下代码,这是在我的 controller 中使用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 抛出的 Exception 类是NotFoundHttpException
而不是NotFoundException
。
由于 Laravel 4 使用 Symfony 的 HttpKernal,因此 Exception is here 。
您可以在此处看到App::abort()
在触发 404 时抛出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 的相应代码。 其他状态代码返回其他异常类。 要捕获所有HTTP 状态错误代码异常,请键入HttpException 的提示,如下所示:
// HttpException handler
App::error(function(\Symfony\Component\HttpKernel\Exception\HttpException $e)
{
return Response::json(array(
'error' => $e->getMessage(),
), $e-> getStatusCode());
});
最后, 在决定返回 JSON 或 HTML 时,请考虑使用一些内容协商。
该解决方案对我不起作用,因此如果有人仍在寻找答案,我认为最好将其放在这里而不是创建另一个问题。
一段时间后我也遇到了这个问题,在我的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);
这就是诀窍。 希望这能有所帮助。
就我而言,我在 <?php 前面找到了一些空间
dump
和其他打印功能当我注意到这个问题时,我正在积极调试。 是因为当时我在代码中调用了dump(...)
。
当我删除所有调试dump
调用时,状态代码再次正确为404
(使用abort(404
))。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.