Question

Im using laravel 4.

I have a view nest.blade.php and the corresponding controller NestController.php:

Controller content:

class NestController extends BaseController {

    public function showView()
    {
        return View::make('nest');
    }

}

Route:

Route::get('/nest', 'NestController@showView');

When I go to url/nest it doesnt work. When I go to url/index.php/nest it does work.

Obviously I just want it to be /nest without the index.php.

How can i resolve this?

My htaccess:

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>
Was it helpful?

Solution

Pretty URLs

The framework ships with a public/.htaccess file that is used to allow URLs without index.php. If you use Apache to serve your Laravel application, be sure to enable the mod_rewrite module.

If the .htaccess file that ships with Laravel does not work with your Apache installation, try this one:

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

For more related help, check this answer.

OTHER TIPS

I enabled the mod_rewrite module in the Apache HTTP server, restarted Apache service and tested again and it WORKED!!!

Below is the code i used to enable mode_rewrite;

1) Un-Hash this line in Apache/conf/httpd.conf

LoadModule rewrite_module modules/mod_rewrite.so

2) Create a new configuration for "sample-project" without modifying the default configuration in the httpd.conf file

Directory "C:/Apache24/htdocs/sample-project">
  Options Indexes FollowSymLinks MultiViews
  AllowOverride All
  Order allow,deny
  Allow from all
Directory>

Be Alert! If it is not working even after enabling rewrite module. You need to change the line "AllowOverride None" to "AllowOverride All" in httpd.conf.

As @The Alpha alerted, Laravel don't need to be configured for this purpose.

When you change the line AllowOverride None to AllowOverride All in httpd.conf be sure that you do it inside <directory ...> that contains valid path.

Example

<Directory "/var/www/html"> #check path
   Options Indexes FollowSymLinks
   AllowOverride All
</Directory>

For some reasons the answers above are not working for me, so here is the only one that worked for me.

I am using ubuntu 18.04 amd64 as my development server environment. So I modified apache.conf file located at/etc/apache2

From:

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

To:

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

And Also From:

<Directory /usr/share> AllowOverride None Require all granted

To

<Directory /usr/share> AllowOverride All Require all granted

After that, you need to restart apache using sudo service apapche2 restart command in the terminal

Now I can access the page without using index.php in the URL

Credit goes to: joshymatheww @ Laracasts servers discussion channel on Aug 5, 2017

Login to the terminal

sudo nano /etc/apache2/apache2.conf

After line

<Directory /var/www/>
.
.
.
</Directory>

and paste below code

<Directory /var/www/html/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
</Directory>

Now Ctrl+O and then Ctrl+M and then Ctrl+x

Now restart apache server

sudo service apache2 restart

set this in your .htaccess

DirectoryIndex index.php

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

RewriteEngine On

RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
RewriteRule ^(.*) - [E=BASE:%1]

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^index\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .? - [L]

RewriteRule .? %{ENV:BASE}/index.php [L]

Try the following .htaccess. I never had any trouble with that on a server or localhost environment.

DirectoryIndex index.php

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

        RewriteEngine On

        RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
        RewriteRule ^(.*) - [E=BASE:%1]

        RewriteCond %{ENV:REDIRECT_STATUS} ^$
        RewriteRule ^index\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]

        RewriteCond %{REQUEST_FILENAME} -f
        RewriteRule .? - [L]

        RewriteRule .? %{ENV:BASE}/index.php [L]

    </IfModule>

First of All you need to set AllowOverride All in /etc/apache2/apache2.conf. Find the following block:

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride All
        DirectoryIndex index.php
        Require all granted
</Directory>

then you need to modify /etc/apache2/mods-available/dir.conf and move index.php first :

<IfModule mod_dir.c>
        DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>

AND DO NOT FORGET: Run a2enmode

sudo a2enmod rewrite

and then

sudo service apache2 restart

This way you apply it for all your laravel projects (inside /var/www/ folder).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top