JasonMortonNZ
JasonMortonNZ

Reputation: 3750

My Routes are Returning a 404, How can I Fix Them?

I've just started learning the Laravel framework and I'm having an issue with routing.

The only route that's working is the default home route that's attached to Laravel out of the box.

I'm using WAMP on Windows and it uses PHP 5.4.3, and Apache 2.2.22, and I also have mod_rewrite enabled, and have removed the 'index.php' from the application.php config file to leave an empty string.

I've created a new controller called User:

class User_Controller extends Base_Controller {
    public $restful = true;

    public function get_index() 
    {
        return View::make('user.index');
    }
}

I've created a view file in application/views/user/ called index.php with some basic HTML code, and in routes.php I've added the following:

Route::get('/', function () {
    return View::make('home.index');
});

Route::get('user', function () {
    return View::make('user.index');
});

The first route works fine when visiting the root (http://localhost/mysite/public) in my web browser, but when I try to go to my second route with http://localhost/mysite/public/user I get a 404 Not Found error. Why would this be happening?

Upvotes: 90

Views: 192390

Answers (20)

Hashim Aziz
Hashim Aziz

Reputation: 6052

Check for a .env.backup

I got this error locally while writing and testing some new tests. After ruling out every other answer to this question, I finally decided to go into my last backup and compare the files in the server root (where the environment files are located).

I then noticed I had an .env.backup file that shouldn't have been there - this file is automatically created by Laravel to backup the contents of your .env file into before pasting the contents of your test-specific environment files - when the tests are done running, it copies your original contents back into .env. Except that for some reason Laravel didn't automatically do this last step, causing some (but not all) of my views to return 404s. Deleting the incomplete .env and renaming .env.backup to .env is all that's required to fix the issue immediately.

Upvotes: 0

athula
athula

Reputation: 31

Route::get('/', function() {
    return View::make('home.index');
});
    
Route::get('user', function() {
    return View::make('user.index');
});

change above to

Route::get('user', function() {
    return View::make('user.index');
});
    
Route::get('/', function() {
    return View::make('home.index');
});

You have to use '/'(home/default) at the end in your routes

Upvotes: 0

Mathieu Perino
Mathieu Perino

Reputation: 41

Don't forget the RewriteBase in your public/.htaccess:

For example:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /your/folder/public

Upvotes: 4

user1930566
user1930566

Reputation: 391

Have you tried to check if

http://localhost/mysite/public/index.php/user 

was working? If so then make sure all your path's folders don't have any uppercase letters. I had the same situation and converting letters to lower case helped.

Upvotes: 39

Mario Uvera
Mario Uvera

Reputation: 851

Using WAMP click on wamp icon ->apache->apache modules->scroll and check rewrite_module.

Restart a LoadModule rewrite_module

Note: the server application restarts automatically for you once you enable "rewrite_module"

Upvotes: 63

Priyanka Rathod
Priyanka Rathod

Reputation: 91

Just Run in your terminal.

php artisan route:clear

Upvotes: 9

Pramod yadav
Pramod yadav

Reputation: 1

The Main problem of route not working is there is mod_rewrite.so module in macos, linux not enabled in httpd.conf file of apache configuration, so can .htaccess to work. i have solved this by uncomment the line :

# LoadModule rewrite_module libexec/apache2/mod_rewrite.so

Remove the # from above line of httpdf.conf. Then it will works.
enjoy!

Upvotes: 0

Abhi
Abhi

Reputation: 119

  1. setup .env file
  2. configure index.html
  3. make sure u have .htaccess
  4. sudo service apache2 restart

most probably it's due to cache problems

Upvotes: 0

Giovanni Orlando
Giovanni Orlando

Reputation: 21

If you're using Vagrant though Homestead, it's possible there was an error mounting the shared folder. It looks like Vagrant takes your files from that folder and swaps out the files that are actually on the host machine on boot, so if there was an error, you're essentially trying to access your Laravel installation from when you first made it (which is why you're only getting "home"- that was generated during installation).

You can easily check this by sshing into your vm and checking the routes/web.php file to see if it's actually your file. If it isn't, exit out and vagrant halt, vagrant up, and look for errors on boot.

Upvotes: 0

user10730910
user10730910

Reputation: 1

the simple Commands with automatic loads the dependencies

composer dump-autoload

and still getting that your some important files are missing so go here to see whole procedure

https://codingexpertise.blogspot.com/2018/11/laravel-new.html

Upvotes: 0

jewelhuq
jewelhuq

Reputation: 1203

I think you have deleted default .htaccess file inside the laravel public folder. upload the file it should fix your problem.

Upvotes: 0

Wasim A.
Wasim A.

Reputation: 9890

You could try to move root/public/.htaccess to root/.htaccess and it should work

Upvotes: 6

Andrew Vickers
Andrew Vickers

Reputation: 2654

On my Ubuntu LAMP installation, I solved this problem with the following 2 changes.

  1. Enable mod_rewrite on the apache server: sudo a2enmod rewrite.
  2. Edit /etc/apache2/apache2.conf, changing the "AllowOverride" directive for the /var/www directory (which is my main document root): AllowOverride All

Then restart the Apache server: service apache2 restart

Upvotes: 149

Bakhtawar Gill
Bakhtawar Gill

Reputation: 439

Just Run in your terminal.

 composer dump-autoload

Upvotes: 0

Rohan Kalra
Rohan Kalra

Reputation: 1

you must be using Laravel 5 the command

  class User_Controller extends Controller {
  public $restful = true;
  public function get_index(){
  return View('user.index');
  }
  }

and in routes.php

  Route::get('/', function()
  {
  return view('home.index');
  });

  Route::get('user', function()
  {
  return view('user.index');
  });

Laravel 5 command changes for view and controller see the documentation i was having same error before

Upvotes: 0

mdg
mdg

Reputation: 546

OK, so after bashing my head on this problem for a little over a day... I got up and did what I SHOULD have done yesterday, and DEBUGGED what was going on!

What Laravel is TRYING to do here, is insert the file index.php right in front of the path given as a Route. SO for instance, if you specified a Route::get('/account/create', ..., and execute your app from say localhost/laravel/authenticate/public/account/create on your browser, then laravel wants to execute localhost/authenticate/public/index.php/account/create, but to do that.... Apache needs to see that requests through /wamp/www/laravel/laravel/authentication/public (your path may vary somewhat, depending on where your laravel app is actually installed, but the trailing public is where the substitution needs to take place) must have a 'RewriteRule' applied.

Thankfully, laravel supplies the correct Rewrite rule in a handy .htaccess file right there in your app's public folder. The PROBLEM is, the code in that '.htaccess' file won't work with the way WAMP is configured out of the box. The reason for this SEEMS to be the problem suggested by muvera at the top of this thread -- the rewrite_module code needs to be loaded by Apache before the RewriteRule stuff will work. Heck this makes sense.

The part that DOESN'T make sense: simply stopping and restarting Apache services will not pick up the changes necessary for WAMP to do the right thing with your RewriteRule -- I know, I tried this many times!

What DOES work: make the changes suggested by muvera (see top of thread) to load the correct modules. Then, reset your whole Windows session, thus dumping Apache out of memory altogether. Restart (reload) WAMP, and VOILA! the fix works, the correct RewriteRule is applied, yada, yada; I'm living happily ever after.

The good news out of all this: I know a LOT more about .htaccess, RewriteRule, and httpd.conf files now. There is a good (performance) argument for moving the logic from your app's public .htaccess file, and putting it into a Directory ... section of your httpd.conf in your Apache 'bin' folder BTW (especially if you have access to that folder).

Upvotes: 4

Simon E.
Simon E.

Reputation: 58460

I was getting the same problem using EasyPHP. Found that I had to specify AllowOverride All in my <Directory> block in httpd.conf. Without this, Apache sometimes ignores your .htaccess.

Mine ended up looking like this...

<Directory "D:/Dev">
    Options FollowSymLinks Indexes
    #### NEXT IS THE CRUCIAL LINE ####
    AllowOverride All                  
    Order deny,allow
    Allow from 127.0.0.1
    Deny from all
    Require all granted     
</Directory>

Upvotes: 10

dajavax
dajavax

Reputation: 3400

Try enabling short php tags in your php.ini. WAMP has them off usually and laravel needs them on.

Upvotes: 0

PapaSmurf
PapaSmurf

Reputation: 1035

Have you tried adding this to your routes file instead Route::get('user', "user@index")?

The piece of text before the @, user in this case, will direct the page to the user controller and the piece of text after the @, index, will direct the script to the user function public function get_index().

I see you're using $restful, in which case you could set your Route to Route::any('user', 'user@index'). This will handle both POST and GET, instead of writing them both out separately.

Upvotes: 25

David Barker
David Barker

Reputation: 14620

Routes

Use them to define specific routes that aren't managed by controllers.

Controllers

Use them when you want to use traditional MVC architecture

Solution to your problem

You don't register controllers as routes unless you want a specific 'named' route for a controller action.

Rather than create a route for your controllers actions, just register your controller:

Route::controller('user');

Now your controller is registered, you can navigate to http://localhost/mysite/public/user and your get_index will be run.

You can also register all controllers in one go:

Route::controller(Controller::detect());

Upvotes: 5

Related Questions