View [errors.404] not found - laravel-5

I am opening a page which is not present in my application and in order to get rid of 404 error, I wrote below code.
public function report(Exception $exception)
{
if($this->isHttpException($exception)) {
switch ($exception->getStatusCode()) {
case '404':
return \Response::view('errors.404');
}
}
parent::report($exception);
}
Directory structure is like below and you could see there is 404 Blade inside errors directory
My Directory Structure here. Please click it to view the details
When I run the above code, it shows below error.
View [errors.404] not found
Am I missing something?
Thank you very much in advance for any suggestion.

Fix typo in the filename. Blade is misspelled.
You named your file: 404.bade.php instead of 404.blade.php

Related

Design 500 error page only for production

I'm looking for a modern (Laravel 5.4) way to display custom 500 error page only for HTTP (non ajax/fetch) response. I read some threads but each response looks like a trick or is outdated. There is probably something to modify in \App\Exceptions\Handler, but I did not find the "right way".
Is there a simple way to display a specific page on fatal error (uncatched, returning 500) in Laravel 5.4?
In other words, when I have a syntax error on one of my controller, it displays "Whoops something went wrong" with some HTML and 500 error code. I would like to display something else, with the same rules as default behavior (ideally only for HTML browser, not for ajax/fetch, etc.).
EDIT: only in production environment.
Laravel makes it easy to display custom error pages for various HTTP status codes. For example, if you wish to customize the error page for 404 HTTP status codes, create a resources/views/errors/404.blade.php. This file will be served on all 404 errors generated by your application. The views within this directory should be named to match the HTTP status code they correspond to. The HttpException instance raised by the abort function will be passed to the view as an $exception variable.
https://laravel.com/docs/5.4/errors#custom-http-error-pages
From the selected "best answer" of this thread: https://laracasts.com/discuss/channels/general-discussion/custom-error-page-er500
You could modify \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);
}
Your exception will be reported in the logs as usually, but woops page will be replaced by your 500.blade.php view.
Sometimes you have to catch the specific exception in order to render the error view. in Laravel 5.4 you can do this by editing the report() method in the App\Exceptions\Handler class
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);
}

Laravel 5 custom "Not Found" page

The question is the following.
How can I set default route for non-existed pages in Laravel 5? So when page not found, than some default view is shown with status 200.
I think for non-existing pages you should use status code 404 but if you wants to pass 200 ok then this should work fine.
create a file 404.blade.php at views >> errors directory and place abort(200); in it.
Update
Or you can place this code in file app/Exceptions/Handler.php
public function render($request, Exception $e)
{
// 404 page with status code 200
if ($e instanceof ModelNotFoundException) {
return response()->view('errors.404', [], 200);
}
return parent::render($request, $e);
}
Note: creating a file 404.blade.php at views >> errors directory is must OR pass another custom view.
You can create a custom 404 view by creating a Blade template called 404.blade.php and placing it in the resources/views/errors directory.
However, do not send a 200 OK HTTP status. That just breaks everything the HTTP protocol stands for.

Laravel forward to 404 error page

I am using Laravel 5.0. Is there any way to forward to default 404 page error if the user wrong url. I want to forward all the time if the user entered wrong url in my project.
In your resources/views/errors folder make sure you have a 404.blade.php file and if that is not there then create it and put something in this file.
Basically, if that 404 file is not present there then You'll see an error like this:
Sorry, the page you are looking for could not be found.
NotFoundHttpException in Application.php line 901:
....
.
Sepending on your environment setup. FYI, in app\Exceptions\Handler.php file the handler method handles/catches the errors. So check it, you may customize it, for example:
use Exception;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
// You can use/catch this but basically this is not included in Handler
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
class Handler extends ExceptionHandler {
//...
public function render($request, Exception $e)
{
// Customize it, extra code
if ($e instanceof AccessDeniedHttpException) {
return response(view('errors.403'), 403);
}
// The method has only this line by default
return parent::render($request, $e);
}
}
Then, make sure, the 403.blade.php is also available in your resources/views/errors directory.

Laravel 4: redirect if item doesn't exists, ModelNotFoundException doesn't work anyway I try it

I'm following Dayle Rees' book "Code Bright" tutorial on building a basic app with Laravel (Playstation Game Collection).
So far so good, the app is working but, following his advices at the end of the chapter, I'm doing my homeworks trying to improve it
So, this snippet is working fine for existing models but throws an error if the item doesn't exists:
public function edit(Game $game){
return View::make('/games/edit', compact('game'));
}
In other words, http://laravel/games/edit/1 shows the item with ID = 1, but http://laravel/games/edit/21456 throws an error since there's no item with that ID
Let's improve this behaviour, adapting some scripts found also here on StackOverflow (Laravel 4: using controller to redirect page if post does not exist - tried but failed so far):
use Illuminate\Database\Eloquent\ModelNotFoundException; // top of the page
...
public function edit(Game $game){
try {
$current = Game::findOrFail($game->id);
return View::make('/games/edit', compact('game'));
} catch(ModelNotFoundException $e) {
return Redirect::action('GamesController#index');
}
}
Well... nothing happens! I still have the error with no redirect to the action 'GamesController#index'... and please notice that I have no namespaces in my Controller
I tried almost anything:
Replace catch(ModelNotFoundException $e) with catch(Illuminate\Database\Eloquent\ModelNotFoundException $e): no way
put use Illuminate\Database\Eloquent\ModelNotFoundException; in Model instead of Controller
Return a simple return 'fail'; instead of return Redirect::action('GamesController#index'); to see if the problem lies there
Put almost everywhere this snippet suggested in Laravel documentation
App::error(function(ModelNotFoundException $e)
{
return Response::make('Not Found', 404);
});
Well, simply nothing happened: my error is still there
Wanna see it? Here are the first two items in the errors stack:
http://www.iwstudio.it/laravelerrors/01.png
http://www.iwstudio.it/laravelerrors/02.png
Please, can someone tell me what am I missing? This is driving me mad...
Thanks in advance!
Here are few of my solutions:
First Solution
The most straightforward fix to your problem will be to use ->find() instead of ->findOrFail().
public function edit(Game $game){
// Using find will return NULL if not found instead of throwing exception
$current = Game::find($game->id);
// If NOT NULL, show view, ELSE Redirect away
return $current ? View::make('/games/edit', compact('game')) : Redirect::action('GamesController#index');
}
Second solution
As I notice you may have been using model binding to your route, according to Laravel Route model binding:
Note: If a matching model instance is not found in the database, a 404 error will be thrown.
So somewhere where you define the model binding, you can add your closure to handle the error:
Route::model('game', 'Game', function()
{
return Redirect::action('GamesController#index');
});
Third Solution
In your screenshot, your App::error seems to work as the error says HttpNotFound Exception which is Laravel's way of saying 404 error. So the last solution is to write your redirect there, though this apply globally (so highly discouraged).

Joomla 2.5 - Disable www.[websitename].com/?format=feed&type=rss

I have been searching forever trying to find a way to disable the feed link (ie: www.[websitename].com/?format=feed&type=rss).
Is there a way to disable this link? I have some bad google indexes of these and I want to return 404 not found when google tries to index them again.
Try editing the libraries/joomla/document/feed/feed.php file.
Find __construct method of JFeedDocument class in the file and change it to look like this:
function __construct($options = array()) {
JError::raiseError(404, JText::_('Resource Not Found'));
}
But, in this case, you won't have "feed" support at all.
Just in case someone is out there looking for this, what worked for me was setting 404 Not Found headers in the JDocumentFeed constructor:
function __construct($options = array()) {
if (!headers_sent()) {
header('HTTP/1.0 404 Not Found');
//I guess you could include here a file to show the 404 page
}
exit();
}
The call for JError::raiseError(404, JText::_('Resource Not Found')); gave me a backtrace of the error.

Resources