user3817533
user3817533

Reputation: 659

Laravel Routes not working, Apache configuration only allows for public/index.php/route

Example:

Route::get('/get', function() {
    return 'get';
});

To view the route above, I must navigate to public/index.php/get.

I've viewed quite a few SO posts and googled around trying different things and it hasn't made a difference (yes I restart apache every time).

Here is my .htaccess in the public directory:

<IfModule mod_rewrite.c>
    Options +FollowSymLinks
    RewriteEngine On
</IfModule>

# For all files not found in the file system, reroute the request to the
# "index.php" front controller, keeping the query string intact

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>

What could be causing this still? I'm running Ubuntu.

Upvotes: 40

Views: 73901

Answers (7)

Rizwan
Rizwan

Reputation: 308

I know it's an old question, but for people coming from search engines:

Although the apache site config I had enabled (/etc/apache2/sites-enabled/sitename.conf) had AllowOverride All

But for some reason the /etc/apache2/apache2.conf file had AllowOverride None for /var/www/ directory.

Solution:

  1. Run nano /etc/apache2/apache2.conf
  2. Find Directory /var/www/ (on mac you can ctrl+w, paste the text and hit enter)
  3. Inside it, change AllowOverride None to AllowOverride All

So, this

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>

becomes this:

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
</Directory>

Upvotes: 3

Tantrik
Tantrik

Reputation: 81

In the Apache Configuration file may be located at /etc/httpd/conf/httpd.conf (location and names varies on server), provide AllowOverride permission for .htaccess file by updating the directory as follows:

<Directory "/var/www/laravel-sample-project/public">
   AllowOverride All
</Directory>

This may solve your problem on laravel routes.

Also ensure that you're providing access "AllowOverride All" limited to directories, such as mentioned above and limited to the directory /var/www/laravel-sample-project/public (mentioned here is the root directory for my project which may varies for you)

Upvotes: 7

Mr CaT
Mr CaT

Reputation: 337

Changing AllowOverride None to AllowOverride All and sudo a2enmod rewrite && sudo /etc/init.d/apache2 reload did help.

Upvotes: 5

Pramod yadav
Pramod yadav

Reputation: 1

In MacOs. The Main problem of .htaccess not working is there is not mod_rewrite.so enabled in httpd.conf file of apache configuration. i have solved this by uncomment the line :

LoadModule rewrite_module libexec/apache2/mod_rewrite.so

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

Upvotes: 0

JVitela
JVitela

Reputation: 2512

If you do not use a .htaccess file, you need to specify the directory for your redirections:

  <IfModule mod_rewrite.c>
     RewriteEngine On

     <Directory /home/vitela/laravel/public>
      RewriteBase /public
      RewriteRule ^(.*)/$ /$1 [L,R=301]
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule ^(.*)$ /index.php [L,QSA]
     </Directory>
  </IfModule>

Upvotes: 0

peter.babic
peter.babic

Reputation: 3374

Two most common causes of this behavior are:

  1. mod_rewrite not enabled

    sudo a2enmod rewrite && sudo service apache2 restart

  2. AllowOverride is set to None, set it to All, assuming Apache2.4

    sudo nano /etc/apache2/apache2.conf

search for <Directory /var/www/> and change AllowOverride None to AllowOverride All, then save the file and restart apache

Upvotes: 108

Eduardo Reveles
Eduardo Reveles

Reputation: 2175

Do you have mod_rewrite installed and enabled on apache? Try to remove the if lines ( and ) and see if it throws an error when you try to load the website. If it does, run sudo a2enmod rewrite and restart apache.

This is the .htaccess I have on my public/ directory:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

Upvotes: 44

Related Questions