【问题标题】:Design 500 error page only for production仅为生产设计 500 错误页面
【发布时间】:2017-02-27 13:06:04
【问题描述】:

我正在寻找一种现代(Laravel 5.4)方式来显示自定义 500 错误页面,仅用于 HTTP(非 ajax/fetch)响应。我读了一些帖子,但每个回复看起来都像是一个把戏或者已经过时了。 \App\Exceptions\Handler里面大概有什么要修改的,但是我没有找到“正确的方法”。

在 Laravel 5.4 中是否有一种简单的方法可以在致命错误(未捕获,返回 500)时显示特定页面?

换句话说,当我的一个控制器出现语法错误时,它会显示“哎呀,出了点问题”,并带有一些 HTML 和 500 错误代码。我想显示其他内容,其规则与默认行为相同(理想情况下仅适用于 HTML 浏览器,不适用于 ajax/fetch 等)。

编辑:仅在生产环境中。

【问题讨论】:

    标签: laravel laravel-5.4


    【解决方案1】:

    Laravel 可以轻松显示各种 HTTP 状态代码的自定义错误页面。例如,如果您希望自定义 404 HTTP 状态代码的错误页面,请创建一个resources/views/errors/404.blade.php。此文件将针对您的应用程序生成的所有 404 错误提供。此目录中的视图的命名应与它们对应的 HTTP 状态代码相匹配。由 abort 函数引发的 HttpException 实例将作为 $exception 变量传递给视图。

    https://laravel.com/docs/5.4/errors#custom-http-error-pages

    【讨论】:

    • 我说的是 500 个错误:"> 当我的一个控制器出现语法错误时,它会显示“哎呀,出了点问题”,带有一些 HTML 和 500 错误代码。我想显示其他内容”这与 404 无关。它适用于 404,但不适用于(例如)FatalThrowableError。
    • 此处类似问题的示例(如果我写的内容晦涩难懂)laracasts.com/discuss/channels/general-discussion/…
    • 文档中的 @rap-2-h 404 就是一个例子。创建一个500.blade.php 文件。
    • @ceejayoz 谢谢!我已经试过了,你也可以试试。它只适用于abort(500),不适用于非例外的致命错误(我正是针对这种情况询问的)。有一个简单的测试来重现这个问题:在你的控制器中创建一个语法错误,即使你创建了一个 500.blade.php 页面,它也会显示 Woops。它仅适用于abort()。无论如何,我在下面发布了一个可行的解决方案。
    【解决方案2】:

    来自该主题的选定“最佳答案”:https://laracasts.com/discuss/channels/general-discussion/custom-error-page-er500

    你可以修改\App\Exceptions\Handler::render():

    public function render($request, Exception $exception)
    {
        if (config('app.debug') && !$this->isHttpException($exception)) {
            $exception = new \Symfony\Component\HttpKernel\Exception\HttpException(500);
        }
        return parent::render($request, $exception);
    }
    

    您的异常将像往常一样在日志中报告,但 woops 页面将被您的 500.blade.php 视图替换。

    【讨论】:

    • 我建议键入config('app.debug') 而不是app()->environment('production'),这样您就可以使用.env 文件随意打开/关闭该行为。
    【解决方案3】:

    有时您必须捕获特定异常才能呈现错误视图。在 Laravel 5.4 中,您可以通过编辑 App\Exceptions\Handler 类中的 report() 方法来做到这一点

    public function report(Exception $exception)
    {
        if ($exception instanceof CustomException) {
            // here you can log the error and return the view, redirect, etc...
        }
    
        return parent::report($exception);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      • 2012-09-06
      相关资源
      最近更新 更多