如果在Laravel 5.1中未找到路由,请显示404页面。

22

我正在尝试找出如何在路由未找到时显示404页面未找到。我遵循了许多教程,但它不起作用。

我在\laravel\resources\views\errors中有404.blade.php文件。

同时,在handler.php中也有相关内容。

public function render($request, Exception $e)
{
    if ($e instanceof TokenMismatchException) {
        // redirect to form an example of how i handle mine
        return redirect($request->fullUrl())->with(
            'csrf_error',
            "Opps! Seems you couldn't submit form for a longtime. Please try again"
        );
    }

    /*if ($e instanceof CustomException) {
        return response()->view('errors.404', [], 500);
    }*/

    if ($e instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException)
        return response(view('error.404'), 404);

    return parent::render($request, $e);
}

如果我在浏览器中输入错误的URL,它会返回一个空白页面。我有:
'debug' => env('APP_DEBUG', true),

在app.php中。

有人能帮我吗,如何在路由未找到时显示404页面?谢谢。


你目前得到了什么? - user557846
使用 abort(404); 命令,然后在 errors 文件夹中创建一个名为 404.blade.php 的页面。 - mdamia
1
@mdamia,我在哪里需要使用abort(404)? - scott
1
@aug帖子指定了5.1版本,但那是4.2版本的文档。 - patricus
1
我的错。 - aug
显示剩余2条评论
8个回答

30

我收到了500错误而不是404错误。我通过以下方式解决了这个问题:

在app/Exceptions/Handler.php文件中,有一个render函数。

用以下函数替换该函数:

public function render($request, Exception $e)
{
    if ($this->isHttpException($e)) {
        switch ($e->getStatusCode()) {

            // not authorized
            case '403':
                return \Response::view('errors.403',array(),403);
                break;

            // not found
            case '404':
                return \Response::view('errors.404',array(),404);
                break;

            // internal error
            case '500':
                return \Response::view('errors.500',array(),500);
                break;

            default:
                return $this->renderHttpException($e);
                break;
        }
    } else {
        return parent::render($request, $e);
    }
}

您可以使用保存在 views/errors/404.blade.php 中的视图,等等。


9

enter image description here> abort方法会立即引发一个异常,该异常将由异常处理程序呈现。 可选择地,您可以提供响应文本:


abort(403, 'Unauthorized action.');

你的app_debug设置为true了吗?如果是这种情况,Laravel会为了调试目的抛出带有回溯信息的错误。如果你将值改为false,Laravel将在errors文件夹中显示默认的404页面。话虽如此,你可以随时选择使用abort函数。在控制器级别或路由级别使用都可以,完全取决于你。
Route::get('/page/not/found',function($closure){
  // second parameter is optional. 
  abort(404,'Page not found');
  abort(403); 
});

@mdamia,我在哪里需要使用abort(403)? - scott
你可以自行决定何时何地使用abort。请查看更新的答案。 - mdamia
我已经启用了True,但它显示空白页面。 - scott
@mdamia.i 抄获了您的代码并添加到 route.php 中,但它返回一个空白页面。即使我启用了调试模式,它也不会抛出异常。 - scott
你的错误文件夹中是否有与错误编号对应的页面?在 abort(404) 页面中,页面名称为 404.blade.php。 - mdamia
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/87850/discussion-between-tester-and-mdamia。 - scott

6

@tester.您的问题已经得到解决,请尝试在composer中使用以下命令:

php artisan view:clear

然后再尝试一个未知的URL。因为我之前也遇到过同样的错误。


1
无需检查错误类型并手动呈现404视图。 Laravel已经知道使用抛出的HTTP错误代码(404 = resources/views/errors/404.blade.php)呈现视图。 摆脱额外的检查,它应该可以正常工作。
public function render($request, Exception $e)
{
    if ($e instanceof TokenMismatchException) {
        // redirect to form an example of how i handle mine
        return redirect($request->fullUrl())->with(
            'csrf_error',
            "Opps! Seems you couldn't submit form for a longtime. Please try again"
        );
    }

    return parent::render($request, $e);
}

我尝试了你的代码,但是它没有起作用。之后,我按照mdamia建议创建了一个新的Laravel项目,然后使用了你的代码,它完美地运行了。 - scott

1

我在 app/Exceptions/Handler.php (Laravel 5.2) 中使用以下代码:

/**
 * Render an exception into an HTTP response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Exception  $e
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $e)
{
    if ($e instanceof \ReflectionException OR $e instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException) //Si la ruta no existe, mostar view 404.
        return response(view('errors.404'), 404);
    return parent::render($request, $e);
}

它看起来像这样:img


0
如果您想在路由未找到时重定向到404页面...
Route::fallback(function () {
    return view('404');
});

0
在配置文件夹 app.php 中更改以下代码。
'debug' => env('APP_DEBUG', true),

在 App->Exception->Handler.php 文件中,使用下面的代码替换 Render 函数。
public function render($request, Exception $exception)
{
    
    if ($exception instanceof ModelNotFoundException) 
    {
    return response()->view('errors.404', [], 404);
    }

    
    if ($exception instanceof \ErrorException) {
    return response()->view('errors.500', [], 500);
    } 
    else {
    return parent::render($request, $exception);
    }
    return parent::render($request, $exception);
}

0
在 Apache 中,您可以将此代码放入主目录下的 .htaccess 文件中,并确保将 httpd 配置文件中的 AllowOverride 指令更改为 all。
ErrorDocument 404 the\path\to\404.blade.php

我正在Windows 7上使用XAMPP本地服务器。 - scott
请查看此链接:https://dev59.com/y4Hba4cB1Zd3GeqPMQ9R - Mohammed Elhag
@ Mohammed Elhag。问题已经按照patricus和mdamia的建议解决了。问题出在Laravel项目上。我创建了一个新项目并尝试,现在它完美运行。 - scott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接