Laravel 4 总是返回 HTTP 状态码 200

问题描述 投票:0回答:6

我在 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 laravel laravel-4
6个回答
9
投票

对于仍在谷歌搜索此问题的任何人:

我在这个问题上苦苦挣扎了几个小时。对我来说,问题是由我的一个控制器的问题引起的。

检查所有控制器并确保

<?php
标签前面没有空格。 <
?php
标签应该是文件中的第一件事。在任何这样路由的控制器中,
<?php
标签前面的一个空格:

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

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


7
投票

我相信,无论如何,您应该收到 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());
 });

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


2
投票

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

一段时间后我也遇到了这个问题,在我的

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);

这就成功了。希望这能有所帮助。


0
投票

就我而言,我在前面找到了一些空间

删除
dump
和其他打印功能

注意到这个问题时,我正在积极调试。是因为我当时在代码里调用了

dump(...)

当我删除所有调试

dump
调用时,状态代码再次正确
404
(使用
abort(404
)。


0
投票

0
投票

我刚刚花了两天时间试图解决一个类似的问题:无论我试图通过服务器响应发送什么标头或状态代码,我总是会得到一个状态代码 200,默认内容类型为 text/html。 Laravel sanctum 的 csrf-cookie 不起作用。

我的问题是由 laravel 配置文件顶部的换行符引起的。

示例代码:

` 
  //<--- \n
<?php

return [
    ...
];

`

为了找到罪魁祸首文件,在 vscode 中,我对项目的所有文件使用了正则表达式搜索: +(

knows12 的原始答案对解决我的问题非常有用,谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.