I want to have a custom 500 error page. This can be done simply by creating a view in errors/500.blade.php
.
This is fine for production mode, but I no longer get the default exception/ debug pages when in debug mode (the one that looks grey and says "Whoops something went wrong").
Therefore, my question is: how can I have a custom 500 error page for production, but the original 500 error page when debug mode is true?
I found the best way to solve my problem is to add the following function to 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
}
Better solutions are welcome!
Simply add this code in \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);
}
}
Or
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);
}
}
Add the code to the app/Exceptions/Handler.php
file inside the Handler
class:
protected function convertExceptionToResponse(Exception $e)
{
if (config('app.debug')) {
return parent::convertExceptionToResponse($e);
}
return response()->view('errors.500', [
'exception' => $e
], 500);
}
The convertExceptionToResponse
method gets right such errors that cause the 500 status.
Add this code to the app/Exceptions/Handler.php
, render
method. I think this is clean and simple. Assuming you have custom 500 error page.
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);
}
}
use commented line when you need default whoops error page for debugging. use other one for custom 500 error page.