My Routes are Returning a 404, How can I Fix Them?
PhpLaravelRoutingLaravel RoutingLaravel 3Php Problem Overview
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?
Php Solutions
Solution 1 - Php
On my Ubuntu LAMP installation, I solved this problem with the following 2 changes.
- Enable mod_rewrite on the apache server:
sudo a2enmod rewrite
. - 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
Solution 2 - Php
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"
Solution 3 - Php
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.
Solution 4 - Php
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.
Solution 5 - Php
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>
Solution 6 - Php
You could try to move root/public/.htaccess
to root/.htaccess
and it should work
Solution 7 - Php
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());
Solution 8 - Php
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).
Solution 9 - Php
Don't forget the "RewriteBase
" in your public/.htaccess
:
For example :
Options +FollowSymLinks
RewriteEngine On
RewriteBase /your/folder/public
Solution 10 - Php
Just Run in your terminal.
php artisan route:clear
Solution 11 - Php
Try enabling short php tags in your php.ini. WAMP has them off usually and laravel needs them on.
Solution 12 - Php
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
Solution 13 - Php
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
Solution 14 - Php
Just Run in your terminal.
composer dump-autoload
Solution 15 - Php
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!
Solution 16 - Php
I think you have deleted default .htaccess file inside the laravel public folder. upload the file it should fix your problem.
Solution 17 - Php
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
Solution 18 - Php
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.
Solution 19 - Php
- setup .env file
- configure
index.html
- make sure u have
.htaccess
sudo service apache2 restart
most probably it's due to cache problems