我试图让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?
答案 0 :(得分:11)
很简单,我假设您使用Laravel v5 ++只是转到
app > Exceptions > Handler.php
见下图:
并修改以下代码:
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
页面:
好吧,您可以自己自定义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)
答案 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' ...
]);
额外信息
问题是它适用于 Laravel
和 Lumen
(Laravel 的微框架)。然而,
response()->view()
不适用于 Lumen
。