php.htaccesslaravellaravel-4laravel-routing

How can I remove “public/index.php” in the Laravel Url?


I need to remove index.php or public/index.php from the generated URL in Laravel; commonly the path is localhost/public/index.php/someWordForRoute, It should be something like localhost/someWordForRoute.

.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]

app/config/app.php

'url' => 'http://localhost',

How can I change that?


Solution

  • Option 1: Use .htaccess

    If it isn't already there, create an .htaccess file in the Laravel root directory. Create a .htaccess file your Laravel root directory if it does not exists already. (Normally it is under your public_html folder)

    Edit the .htaccess file so that it contains the following code:

    <IfModule mod_rewrite.c>
       RewriteEngine On 
       RewriteRule ^(.*)$ public/$1 [L]
    </IfModule>
    

    Now you should be able to access the website without the "/public/index.php/" part.

    Option 2 : Move things in the '/public' directory to the root directory

    Make a new folder in your root directory and move all the files and folder except public folder. You can call it anything you want. I'll use "laravel_code".

    Next, move everything out of the public directory and into the root folder. It should result in something somewhat similar to this: enter image description here

    After that, all we have to do is edit the locations in the laravel_code/bootstrap/paths.php file and the index.php file.

    In laravel_code/bootstrap/paths.php find the following line of code:

    'app' => __DIR__.'/../app',
    'public' => __DIR__.'/../public',
    

    And change them to:

    'app' => __DIR__.'/../app',
    'public' => __DIR__.'/../../',
    

    In index.php, find these lines:

    require __DIR__.'/../bootstrap/autoload.php';     
    $app = require_once __DIR__.'/../bootstrap/start.php';
    

    And change them to:

    require __DIR__.'/laravel_code/bootstrap/autoload.php';     
    $app = require_once __DIR__.'/laravel_code/bootstrap/start.php';
    

    Source: How to remove /public/ from URL in Laravel