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

时间:2013-05-23 22:14:48

标签: 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);
 });

4 个答案:

答案 0 :(得分:7)

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

我几个小时都在努力解决这个问题。对我来说,问题是由我的一个控制器出现问题引起的。

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

Route::controller('example', 'ExampleController');

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

答案 1 :(得分:6)

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

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

由于Laravel 4使用Symfony的HttpKernal,因此异常为here

当触发404时,您可以看到here其中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的相应代码。其他状态代码返回其他异常类。要捕获所有 HTTP状态错误代码异常,请为HttpException键入提示,如下所示:

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

最后,请考虑using a bit of Content Negotiation when deciding to return JSON or HTML

答案 2 :(得分:0)

解决方案对我不起作用,所以如果有人还在寻找答案,我认为最好把它放在这里,而不是创建另一个问题。

过了一段时间我也遇到了这个问题,在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);

这就是诀窍。希望这可以提供帮助。

答案 3 :(得分:0)

就我而言,我在<?php

前面发现了一些空间