【问题标题】:Add custom 500 error page only for production in Laravel仅在 Laravel 中为生产添加自定义 500 错误页面
【发布时间】:2017-03-06 12:32:14
【问题描述】:

我想要一个自定义的 500 错误页面。这可以通过在errors/500.blade.php 中创建一个视图来完成。

这对于生产模式来说很好,但是在调试模式下我不再获得默认的异常/调试页面(那个看起来是灰色的并说“哎呀,出了点问题”)。

因此,我的问题是:我如何才能有一个自定义的 500 错误页面用于生产,但调试模式为 true 时原来的 500 错误页面?

【问题讨论】:

  • 你能截屏吗?当你处于生产模式时出现错误 500
  • if(env("APP_ENV") == "production"){ abort(500); } 是一种非常简单的方法。 abort($code) 返回在 errors/{code}.blade.php 中找到的视图
  • @lewis4u 对于生产模式,我只想使用我的自定义 500 页面。不管它看起来如何。但是对于调试模式,我想使用 Laravel 的默认页面,它看起来是灰色的,上面有一堆错误信息。

标签: laravel laravel-5 laravel-5.1


【解决方案1】:

只需在 \App\Exceptinons\Handler.php 中添加此代码:

public function render($request, Exception $exception)
{
    // Render well-known exceptions here

    // Otherwise display internal error message
    if(!env('APP_DEBUG', false)){
        return view('errors.500');
    } else {
        return parent::render($request, $exception);
    }
}

或者

public function render($request, Exception $exception)
{

    // Render well-known exceptions here

    // Otherwise display internal error message
    if(app()->environment() === 'production') {
        return view('errors.500');
    } else {
        return parent::render($request, $exception);
    }
}

【讨论】:

  • 那行不通。原因是无论调试是否正确,它总是会显示自定义 500 页面。如果 debug 为 false,我希望它显示 Laravel 的默认错误页面以及相应的错误信息。
  • 目前我在我的应用程序中使用了这段确切的代码,它按预期工作。当APP_DEBUG.env 中设置为true 时,我看到了完整的异常渲染。我正在使用 Laravel 5.3。你用的是哪个版本?
【解决方案2】:

我发现解决我的问题的最好方法是将以下函数添加到App\Exceptions\Handler.php

protected function renderHttpException(HttpException $e)
{
    if ($e->getStatusCode() === 500 && env('APP_DEBUG') === true) {
        // Display Laravel's default error message with appropriate error information
        return $this->convertExceptionToResponse($e);
    }
    return parent::renderHttpException($e); // Continue as normal 
}

欢迎提供更好的解决方案!

【讨论】:

【解决方案3】:

从 Laravel 5.5+ 开始,如果你有 APP_DEBUG=false 并且有一个 views/errors/500.blade.php 文件,这将自动发生。

https://github.com/laravel/framework/pull/18481

【讨论】:

    【解决方案4】:

    将代码添加到Handler 类内的app/Exceptions/Handler.php 文件中:

    protected function convertExceptionToResponse(Exception $e)
    {
        if (config('app.debug')) {
            return parent::convertExceptionToResponse($e);
        }
    
        return response()->view('errors.500', [
            'exception' => $e
        ], 500);
    }
    

    convertExceptionToResponse 方法可以纠正导致 500 状态的错误。

    【讨论】:

      【解决方案5】:

      在 Laravel 7+ 中,你可以做如下方法

      public function render($request, Throwable $exception)
          {
              if (!env('APP_DEBUG', false)) {
                  return response()->view("error500");
              } else {
                  return parent::render($request, $exception);
              }
          }
      

      【讨论】:

        【解决方案6】:

        将此代码添加到app/Exceptions/Handler.phprender 方法中。我认为这是干净和简单的。假设您有自定义 500 错误页面。

        public function render($request, Exception $e) {
              if ($this->isHttpException($e)) {
                return $this->toIlluminateResponse($this->renderHttpException($e), $e);
            } elseif (!config('app.debug')) {
                return response()->view('errors.500', [], 500);
            } else {
              // return $this->toIlluminateResponse($this->convertExceptionToResponse($e), $e);
                return response()->view('errors.500', [], 500);
            }
        }
        

        当您需要默认的 whoops 错误页面进行调试时使用注释行。使用另一个自定义 500 错误页面。

        【讨论】:

          【解决方案7】:

          在 Laravel 8.x & 9.x 中,您可以使用以下方法:

          在项目根文件夹的“.env”文件中, 将APP_DEBUG 设置为false

          然后在~/resources/views/errors 内创建一个名为500.blade.php 的文件 (如果您还没有错误文件夹,请创建它)。

          这将在任何 500 服务器错误响应上呈现自定义页面。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-02-04
            • 2015-08-26
            • 2015-11-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多