如何使Laravel 5返回404状态代码

时间:2017-03-05 21:27:12

标签: laravel-5

我试图让Laravel 5(5.1.31)在找不到页面时返回404的http状态响应。我已经尝试了几件事,它总是返回200.

在我的控制器中我有这个:

else
   {
   header('HTTP/1.0 404 Not Found');
   return view('errors.404);
   }

我也尝试过:

else
   {
   http_response_code(404);
   return view('errors.404);
   }

else
   {
   abort(404, 'Page not found');
   }

我也试过把它放在404.blade

@inject( 'response', 'Illuminate\Http\Response' )
{{ $response->status(404) }}

没有成功。无论我尝试什么,Laravel都会返回200.如何让它返回404?

7 个答案:

答案 0 :(得分:11)

很简单,我假设您使用Laravel v5 ++只是转到

app > Exceptions > Handler.php

见下图:

enter image description here

并修改以下代码:

public function render($request, Exception $e)
{
    return parent::render($request, $e);
}

public function render($request, Exception $e)
{
    if ($e instanceof MethodNotAllowedHttpException)
    {
        abort(404);
    }
    return parent::render($request, $e);
}

然后,不要忘记在404.blade.php文件夹中添加errors页面:

enter image description here

好吧,您可以自己自定义404.blade.php中的404页面。

注意

这种情况仅在您运行URL时未列在路由中。您可以在web.php文件中找到。

如果您需要通过自定义调用,只需调用控制器,如下所示:

public function show_me()
{
   abort(404);  //404 page
}

希望它有所帮助!

答案 1 :(得分:7)

虽然我不知道为什么abort没有像我们想的那样返回404状态,但我确实找到了一个解决方案,使Laravel返回404状态:

这是我做的:

else {
    $data['title'] = '404';
    $data['name'] = 'Page not found';
    return response()
        ->view('errors.404',$data,404);
}

这实际上对我的目的更有效,因为它不会像我的中止那样弄乱我的404.blade的内容。

答案 2 :(得分:4)

您可以使用中止助手:

abort(404);

答案 3 :(得分:2)

如果要返回JSON而不是视图,则可以在控制器中调用它:

return response(['error'=>true,'error-msg'=>$msg],404);

答案 4 :(得分:2)

如果你有一个 404 page under resources/views/errors/ 那么就做一个

return view('errors.404');

或喜欢风声猎猎 suggests

abort(404);

答案 5 :(得分:0)

这是我所做的,因为我需要使用我的自定义视图和 404 标头:

return response()
            ->view('my_view', $data, 404);

我是在 https://laravel.com/docs/8.x/responses#view-responses

上找到的

它适用于 Laravel 8,但它似乎适用于旧版本。

答案 6 :(得分:0)

你也可以这样做

return response(view('view_name'), 404);

您也可以像这样在响应中添加 headers

return response(view('view_name'), 404, [
    'header_1' => 'header 1 value',
    'header_2' => 'header 2 value' ...
]);

额外信息

问题是它适用于 LaravelLumen(Laravel 的微框架)。然而,

response()->view() 

不适用于 Lumen