Laravel 4始终返回HTTP状态代码200

Sar*_*mar 4 php laravel laravel-4

我在error.php中有以下代码,这是App::abort(404, $error)在我的控制器中触发的.我的响应状态代码仍为200(确定).我试过各种错误代码,如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);
 });
Run Code Online (Sandbox Code Playgroud)

小智 7

对于仍然在Google上搜索此问题的人:

几个小时我一直在努力解决这个问题.对我来说问题是由我的一个控制器的问题引起的.

检查所有控制器,确保<?php标签前面没有空格.< ?phptag应该是文件中的第一件事.<?php任何控制器中标记前面的单个空格,如下所示:

Route::controller('example', 'ExampleController');
Run Code Online (Sandbox Code Playgroud)

将导致所有状态代码为200.

  • 我检查了所有控制器......仍然遇到这个问题. (3认同)

fid*_*per 6

我相信,无论如何,您应该收到404响应,因此可能会发生其他事情,这是因为代码未包含在您的问题中.

话虽如此,为404抛出的Exception类NotFoundHttpException不是NotFoundException.

由于Laravel 4使用Symfony的HttpKernal,所以Exception就在这里.

你可以看到这里那里App::abort()抛出NotFoundHttpException时,404被触发.

因此,您的代码应如下所示:

// 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);
 });
Run Code Online (Sandbox Code Playgroud)

重要提示:这只会触发404状态,因为这是NotFoundHttpException的相应代码.其他状态代码返回其他异常类.要捕获所有 HTTP状态错误代码异常,请键入HttpException的提示,如下所示:

// HttpException handler
App::error(function(\Symfony\Component\HttpKernel\Exception\HttpException $e)
{
    return Response::json(array(
        'error' => $e->getMessage(),
    ), $e-> getStatusCode());
 });
Run Code Online (Sandbox Code Playgroud)

最后,在决定返回JSON或HTML时,请考虑使用一些内容协商.